728x90
반응형
SMALL

MySQL2023. 3. 14. 16:11
728x90
반응형
SMALL

UTF8로 mysql DBMS를 설정해놓았지만 insert하면서 요런 문제가 발생할 수 있다.

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect string value: '\xF0...

 

 

 

 

차근차근 원인을 찾아보니..

MySQL의 UTF-8 인코딩이 3Byte로 처리되는 캐릭터를 입력하지만, 이모지는 65536 범위를 넘어가서 4byte로 처리될 수 있기에 저런 문제가 발생한다.

이럴때 인코딩 설정을 해줘야하는데 테이블은 물론 컬럼별, 데이터베이스 별로 카테고리를 잡아서 필요에 따라 범위를 정해 인코딩을 지정해줄 수 있다.

이모지를 처리하기 위해 UTF8mb4 인코딩을 사용한다.

 

 

 

 

UTF8mb4 인코딩을 가지는 DB 생성하기)

 

CREATE DATABASE deer_database CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
  
GRANT ALL PRIVILEGES ON deer_database.* TO 'deer_database'@'localhost' IDENTIFIED BY '비밀번호';

flush privileges; -- flush 잊지 말것~

 

 

기존의 DB 인코딩을 UTF8mb4로 변경하기)

 

ALTER DATABASE deer_database CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

 

 

my.cnf 설정 - 윈도우의 경우엔 my.ini)

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

 

이 경우에는 DB 인스턴스를 재시작 해줘야한다.

 

 

그러나 이렇게 해주어도 나는 이모지가 안들어가는 버그가 여전히 남아있었는데..

한참을 찾은끝에 방법을 찾을 수 있었다.

mybatis 접속 JDBC 정보 properties에서 URL 뒤에 useUnicode=true를 추가해주고,

...그리고...

characterEncoding=UTF-8을 붙이지않고 뺀다.

 

밑줄친 부분을 빼준다.

 

 

 

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

characterEncoding=UTF-8을 빼니 잘 돌아갔다..

728x90
반응형
LIST
Posted by 사슴영혼'-'
728x90
반응형
LIST