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 이 추가되면 오작동 함.
같이 보기
- Confluence 와 JIRA 에서 Emoji 입력(🎨)이 가능한 MySQL utf8mb4 인코딩 사용
- MySQL database 와 table 의 character set encoding 확인하는 법
Ref
- MySQL 기본 캐릭터 셋 설정하기 - RHEL/CentOS/Ubuntu
- MySQL database 와 table 의 character set encoding 확인하는 법
- http://info.michael-simons.eu/2013/01/21/java-mysql-and-multi-byte-utf-8-support/
- https://stackoverflow.com/questions/10957238/incorrect-string-value-when-trying-to-insert-utf-8-into-mysql-via-jdbc