MySQL 은 UTF8 구현을 대충 했는지 3 byte 만 처리 가능하고 4 byte 로 인코딩되는 UTF-8 문자를 제대로 지원하지 못하는 문제가 있습니다.


이때문에 UTF-8 로 인코딩을 설정하면 4 byte 도 잘 처리하는 다른 DBMS 와는 달리 utf8mb4 라는 해괴한 인코딩 방식을 사용해야 4byte UTF8 을 지원합니다.


그동안 Confluence 와 JIRA 에서는 MySQL 을 사용할 경우 4 byte UTF-8 을 지원하지 않아서 페이지 내용에 emoji 가 있거나 특수 문자가 포함되었을 경우 다음과 같은 에러가 나고 아예 저장이 되지 않는 문제가 있었습니다.

org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could not update: com.atlassian.confluence.core.BodyContent#38141954; 
uncategorized SQLException for SQL []; SQL state [HY000]; 
error code [1366]; Incorrect string value: '\xF4\x80\x82\x84 z...' for column 'BODY' at row 1; 
nested exception is java.sql.SQLException: Incorrect string value: '\xF4\x80\x82\x84 z...' for column 'BODY' at row 1
Caused by: java.sql.SQLException: Incorrect string value: '\xF4\x80\x82\x84 z...' for column 'BODY' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3536)
CODE



작성중인 문서를 임시 저장하는 기능인 draft 에는 JSON Serialize 시 "\u002f" 와 같이 encoding 을 해서 저장하므로 문제가 없습니다.


드디어 Confluence와 JIRA에서도 MySQL  utf8mb4 인코딩을 지원하므로 새로운 버전을 설치하면 이모지나 특수 문자가 있어도 저장이 가능해 졌습니다.

지원 버전

Confluence 는 7.3 이상 버전, JIRA 는 8.0 이상 버전만 utf8mb4 를 지원합니다.(atlassian 문서 보기)


물론 MySQL 은 5.7.9 이상을 설치해야 합니다.


utf8mb4 로 변경하기


ALTER DATABASE 구문을 사용해서 Database 의 character set 과 collation 을 utf8mb4 로 변경해 주면 됩니다. 아래는 이름이 confluenceDB 인 Database 를 utf8mb4 로 변경하는 예제입니다.

character set 과 collation 변경

ALTER DATABASE confluenceDB CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
SQL


새로 Database 를 생성할 경우 아래 SQL 을 사용합니다.

utf8mb database 생성

CREATE DATABASE confluence  CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin;
 
CREATE USER 'confluence'@'localhost' IDENTIFIED BY 'secret' PASSWORD EXPIRE NEVER; 
GRANT ALL PRIVILEGES ON confluence.* TO 'confluence'@'localhost';
flush privileges;
SQL


MySQL 의 character set 관련한 정보는 Java + MySQL + UTF8mb4(이모지 - Emoji 등) 데이타 처리하기 을 참고하세요.

Ref