블로그 이름

[ERROR] Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect string value: '\xF0..' for column 본문

개발/오류

[ERROR] Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect string value: '\xF0..' for column

Hide 2025. 4. 16. 00:58

이전에 났었던 오류인데, 또 발생하여 재확인하였다.

 

MySQL 컬럼에 저장하려는 문자열(이모지) 가 컬럼의 문자셋 설정과 맞지 않아 발생하는 오류로, MySQL의 기본 문자셋인 utf8은 3바이트까지 저장 가능하고, 이모지는 4바이트여서 utf8 컬럼 문자셋에 저장하려다 발생하는 오류였었다.

 

그리고 테이블과 컬럼의 문자셋을 utf8mb4로 설정하여 해결이 된 듯 하였으나...

 

JDBC 연결 시 동일한 에러 발생하여 재 확인 하였다.

 

SHOW FULL COLUMNS FROM 테이블명; 결과로는 utf8mb4_general_ci로 표시되며 insert문으로 이모지가 들어가는데, DB의 문자셋을 변경하는 것과는 관계 없이 JDBC 에도 문자셋 옵션 설정을 해줘야 하는 것이었다.

application.properties나 application.yml 에
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf8mb4

로, utf8mb4 설정을 해 주어야 한다.

 

JDBC URL에 utf8mb4 설정이 빠져 있으면 애플리케이션에서 전송하는 데이터가 3바이트 UTF8로 인코딩되어 저장 시 에러가 발생한다고 한다. 이 설정이 빠져 있으면 컬럼이 utf8mb4라도 제대로 저장되지 않는다고 한다.

 

my.cnf 또는 my.ini 에서 MySQL 서버 설정 파일에서 utf8mb4로 설정되어야 한다고 하여 수정 후, 다른 에러 발생

이번엔 JDBC 연결조차 안되는 현상, 에러 메세지는 아래와 같다. 

 

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.

Caused by: java.sql.SQLException: Unsupported character encoding 'utf8mb4'.

 

애플리케이션이 서버에 연결할 수 없어 연결 시도를 3번 하였지만 실패 후 포기하였다고 한다.

JDBC 드라이브가 utf8mb4 문자 인코딩을 지원하지 않아 발생하였다는 에러 메세지이다.

 

사용하는 라이브러리 버전이 낮아 utf8mb4를 인식하지 못하였고, JDBC 드라이버가 구버전이라면 지원 안 하는 경우가 있다고 한다. mysql-connector-java 라이브러리의 경우 5.1.33 버전 이상에서 개선되었다고.

가능하면 8.x 이상으로 올리는 것이 좋다고 한다.

 

라이브러리를 8.x 이상으로 변경. 에러 메세지 확인.

Caused by: com.mysql.cj.exceptions.WrongArgumentException: Unsupported character encoding 'utf8mb4'
 
JDBC URL에 utf8mb4를 인식하지 못하고 있다고 한다.

해당 버전에서는 JDBC URL을 아래와 같이 변경.

spring.datasource.url=jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Seoul spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

 

MySQL 8.x JDBC 드라이버에서는 characterEncoding=utf8mb4라고 쓰면 지원하지 않는다는 오류가 난다고 한다. 대신 UTF-8이라고 쓰면 내부적으로 utf8mb4로 처리한다고 한다.

 

라이브러리 변경 및 JDBC URL 옵션 설정하여 해결하였다.