[Error] could not execute statement [(conn=3742) Incorrect string value 에러 해결
could not execute statement [(conn=3742) Incorrect string value: '\xEB\xB0\x9C #1...' for column `shinhan`.`bondreport_d`.`content_dc` at row 1] [insert into bondreport_d (com_st,content_dc,index_nm,insert_dt,insert_id,insert_ip,modify_dt,modify_id,modify_ip,order_nb,create_dt,index_nb,origin_fg) values (?,?,?,?,?,?,?,?,?,?,?,?,?)]; SQL [insert into bondreport_d (com_st,content_dc,index_nm,insert_dt,insert_id,insert_ip,modify_dt,modify_id,modify_ip,order_nb,create_dt,index_nb,origin_fg) values (?,?,?,?,?,?,?,?,?,?,?,?,?)]
오류는 Incorrect string value로, **MariaDB 테이블의 content_dc 컬럼이 지원하지 않는 문자(예: UTF-8 멀티바이트 문자)**가 삽입되었기 때문에 발생한 것입니다. 이 문제는 데이터베이스의 문자 인코딩 설정과 관련이 있습니다.
원인
MariaDB의 기본 문자셋이 latin1 또는 UTF-8의 제한된 버전(utf8)일 가능성이 큽니다. utf8은 3바이트까지의 문자만 지원하며, 일부 멀티바이트 문자(예: 이모지, 한글 등)는 4바이트가 필요합니다. 이 경우 utf8mb4로 변경해야 합니다.
해결 방법
- 데이터베이스와 테이블의 문자셋 확인 MariaDB에서 현재 데이터베이스와 테이블의 문자셋을 확인합니다.결과가 latin1 또는 utf8이라면, utf8mb4로 변경해야 합니다.
1) 데이터베이스 문자셋 확인
SELECT schema_name, default_character_set_name
FROM information_schema.schemata
WHERE schema_name = 'shinhan';
결과가 latin1 또는 utf8이라면, utf8mb4로 변경해야 합니다.
데이터베이스의 문자셋 변경 데이터베이스 문자셋을 utf8mb4로 변경합니다.
ALTER DATABASE shinhan CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
2) 테이블의 문자셋 확인
SHOW TABLE STATUS WHERE Name = 'bondreport_d';
- 테이블의 문자셋 변경 테이블의 문자셋을 utf8mb4로 변경합니다.
ALTER TABLE bondreport_d CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SHOW FULL COLUMNS FROM bondreport_d;
컬럼의 문자셋 변경 문제가 발생한 content_dc 컬럼의 문자셋을 utf8mb4로 변경합니다.
ALTER TABLE bondreport_d MODIFY content_dc TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- Spring Boot 설정 확인 Spring Boot에서 MariaDB 연결 시 올바른 문자셋을 사용하도록 설정합니다. application.properties 또는 application.yml에 다음 설정을 추가합니다.
# application properties
spring.datasource.url=jdbc:mariadb://localhost:3306/shinhan?characterEncoding=utf8&useUnicode=true&serverTimezone=Asia/Seoul
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
# application.yml
spring: datasource: url: jdbc:mariadb://localhost:3306/shinhan?characterEncoding=utf8&useUnicode=true&serverTimezone=Asia/Seoul driver-class-name: org.mariadb.jdbc.Driver
요약
이 문제는 MariaDB가 저장하려는 문자열(한글, 이모지 등)을 처리할 수 있는 인코딩을 지원하지 않아서 발생한 것입니다. 이를 해결하려면 데이터베이스, 테이블, 컬럼의 문자셋을 utf8mb4로 변경하고 Spring Boot의 연결 설정에서도 올바른 인코딩을 지정해야 합니다.
데이터베이스, 테이블, 컬럼 모두 문자셋이 utf8mb4로 되어있음에도 불구하고 계속 같은 에러가 발생한다면 컬럼 길이 제한 확인이 필요합니다.
content_dc 컬럼의 데이터 타입이 충분히 길게 설정되어 있는지 확인하세요. TEXT 데이터 타입은 최대 64KB를 저장할 수 있지만, 길이 제한이 다른 경우가 있을 수 있습니다.
TEXT 타입 자체는 최대 64KB까지 저장할 수 있으므로, 만약 더 큰 데이터가 필요하면 MEDIUMTEXT(16MB) 또는 LONGTEXT(4GB) 같은 데이터 타입으로 변경해야 합니다.
- TEXT, MEDIUMTEXT, LONGTEXT의 저장 용량 차이:
- TEXT: 최대 64KB
- MEDIUMTEXT: 최대 16MB
- LONGTEXT: 최대 4GB
럼의 데이터 타입을 늘려 더 많은 데이터를 저장할 수 있도록 하려면 다음 명령어를 사용할 수 있습니다:
- TEXT에서 MEDIUMTEXT 또는 LONGTEXT로 변경하여 더 큰 데이터를 저장할 수 있도록 합니다.
ALTER TABLE bondreport_d MODIFY content_dc MEDIUMTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
변경 확인
에러가 해결되었습니다.