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


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 도 이에 맞게 설정해야 합니다.


encoding 은 Database, Table, Column 마다 별도로 적용할 수 있지만 Database 차원의 인코딩 설정만 정리합니다.


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;


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






blog comments powered by Disqus