MySQL: 이모지 삽입 시 Incorrect string value 오류 해결

오늘도 어김없이 Mysql에서 작업을 하다가 아래와 같은 오류가 발생했습니다.

MYSQL Incorrect string value: '\xF0'

해당오류는 아주아주 간단한 오류입니다.

일단은 이 오류를 알아보기위한 테스트 환경을 먼저 설명해드리겠습니다.

테이블 스키마
CREATE TABLE `test` (
	`SERIAL` VARCHAR(20) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
	`TEST1` VARCHAR(20) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
	`TEST2` VARCHAR(20) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci',
	`TEST3` VARCHAR(20) NULL DEFAULT NULL COLLATE 'utf8mb3_general_ci'
)
COMMENT='테스트'
COLLATE='utf8mb3_general_ci'
ENGINE=InnoDB
;

위는 테스트를 위한 테이블 스키마 입니다.

실행쿼리
INSERT INTO test(`SERIAL`, `test1`, `test2`,`test3`) VALUES('1','2','3','🎈')

그리고 문제의 실행 쿼리는 위와 같습니다.

이쯤되면 눈치를 채실수도 있겠지만 원인은 저 풍선이모티콘 때문입니다.

해당 오류가 왜 발생하느냐??

원인은 바로 인코딩에 있습니다.

반응형
원인설명

테이블의 스키마를 살펴 보시면 인코딩이 utf8mb3_general_ci으로 되어있는것을 확인하실수 있습니다.

이 인코딩의 의미는 utf8mb3_general_ci
"한문자에 3 최대 3바이트를 사용한다" 라는 의미를 가지고 있습니다.

따라서 🎈 같은 이모지는 4바이트를 사용하기에  utf8mb3_general_ci 과 같이 3바이트를 사용하는 인코딩에서 오류를 반환하게 됩니다.

 

해결

해결법은 아주 간단합니다. 최대 문자바이트를 3이아닌 4로 바꾸면 해결이되는 아주 간단한 오류입니다.

이는 즉 utf8mb3_general_ci 에서  utf8mb4_general_ci 로 변경하면 됩니다.

ALTER TABLE `test`
	CHANGE COLUMN `TEST3` `TEST3` VARCHAR(20) NULL DEFAULT NULL COLLATE 'utf8mb4_0900_ai_ci' AFTER `TEST2`;

인코딩 변경 쿼리는 위와 같습니다.

위처럼 기존 인코딩을 utf8mb4_general_ci 로 변경하고 다시 아까 실패했던 INSERT 문을 실행해보도록 하겠습니다.

INSERT INTO test(`SERIAL`, `test1`, `test2`,`test3`) VALUES('1','2','3','🎈')

위 쿼리를 다시 실행한뒤 조회를 하면 아래와 같이 이모티콘이 해당 컬럼에 정상적으로 삽입되는 것을 확인할수 있습니다.

이모티콘이 삽입되었다.

 

  • 이모지, 특수 심볼, 고대 문자 등 4바이트 문자가 필요하면 무조건 utf8mb4로 설정해야 합니다.
  • 기존 utf8/utf8mb3 테이블에서 바로 4바이트 문자를 넣으려 하면 Incorrect string value 오류 발생.

 

반응형