자바와 MySQL 에서 utf8mb4 인코딩을 처리하기 위한 설정 방법

UTF8 로 DBMS 가 설정되어 있지만 Insert 시 다음과 같은 에러가 발생하는 경우가 있습니다.

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


MySQL 의 UTF-8 은 3 byte 로 표현되는 범위내의 캐릭터만 입력할 수 있지만 이모지처럼 4 byte 로 표현되는 문자가 들어와서 발생한 현상입니다.

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

MySQL encoding

DBMS 생성시 인코딩을 utf8mb4 로 변경

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


기존에 만든 DBMS 라면 아래 명령으로 변경

ALTER DATABASE homestead CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
SQL


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

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


Java & JDBC

JDBC URL 에 useUnicode=true 내용 추가

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

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

characterEncoding=UTF-8
CODE

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


Ref