Java + MySQL + UTF8mb4(이모지 - Emoji 등) 데이타 처리하기

자바와 MySQL 에서 utf8mb4 인코딩을 처리하기 위한 설정 방법에 대해 설명합니다.


MySQL 을 사용할 경우 chracter set encoding 이 UTF8 로 DBMS 가 설정되어 있지만 Insert 시 다음과 같은 에러가 발생하는 경우가 있습니다.

Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1


이는 MySQL 이 UTF-8 을 대충 구현해서 3 byte 캐릭터만 입력할 수 있지만 이모지는 4 byte 를 사용해서 발생한 현상입니다.

이를 해결하려면 MySQL 서버와 DBMS 의 인코딩을 utf8mb4 로 설정하고 JDBC 도 이에 맞게 설정해야 합니다.

utf8mb4 는 표준 인코딩 방식이 아니며 MySQL 의 UTF-8 이 3 byte만 지원하는 문제를 해결하기 위한 땜질 처방입니다.

PostgreSQL 이나 Oracle, MS-SQL 등을 사용한다면 이런 문제를 고민할 필요가 없습니다.


Database encoding 설정


utf8mb4 로 database 생성

MySQL database 생성시 character set 과 collation을 utf8mb4 로 해서 생성하면 됩니다.

CREATE DATABASE homestead CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
  
GRANT ALL PRIVILEGES ON homestead.* TO 'homestead'@'localhost' IDENTIFIED BY 'secret';

flush privileges;


utf8 database 를 utf8mb4 로 변경

기존에 만든 database 라면 encoding 을 변경해 줘야 합니다.


DBMS 를 사용하는 application 을 내리고 변경할 database 를 백업한 후에 아래 명령을 실행해서 인코딩을 변경합니다.

ALTER DATABASE homestead CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

테이블과 컬럼에도 encoding 을 명시했다면 일일이 다 변경해줘야 합니다. (Confluence 와 JIRA 에서 Emoji 입력(🎨)이 가능한 MySQL utf8mb4 인코딩 사용 참고)


my.cnf 설정

encoding handshake 없이 강제로 utf8mb4 를 사용하도록 하기 위해 mysql 서버 설정에 다음 내용을 추가하고 mysql 을 재구동합니다.

[mysqld]
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4
skip-character-set-client-handshake


Java & JDBC

JDBC URL 에 useUnicode=true 내용 추가

jdbc:mysql://localhost:3306/your_database?useUnicode=true

MySQL JDBC 5.1.22(21?) 이하의 JDBC driver 를 사용할 경우 connection string 에 다음 내용 추가 필요

characterEncoding=UTF-8

5.1.22 이상의 버전에서 characterEncoding=UTF-8 이 추가되면 오작동 함.


같이 보기

Ref