DB/MySQL

[MariaDB] "UTF-8" 문자열 자료 입력 시, "Incorrect string value" 오류 발생 문제

채윤아빠 2022. 12. 27. 12:18
728x90
반응형

문제점 및 증상

유튜브 자료를 분석하여 MariaDB에 입력하는 작업을 진행 중에 다음과 같은 오류를 만나게 되었습니다.

  File "C:\Dev\Python\Python310\lib\site-packages\mysql\connector\connection_cext.py", line 573, in cmd_query
    raise get_mysql_exception(
mysql.connector.errors.DataError: 1366 (22007): Incorrect string value: '\xF0\x9F\x91\xA8\xE2\x80...' for column `YOUTUBE_DL`.`CLIP`.`title` at row 1

왠만한 자료들은 입력이 잘 되는데, 유독 이모지가 있는 자료에서만 위와 같은 오류가 계속 발생하였습니다.


해결 방법

아래 테이블 스키마는 유튜브 자료를 입력하는데 사용한 테이블 입니다.

CREATE TABLE `CLIP`
(
    `clip_no`                INT NOT NULL AUTO_INCREMENT COMMENT '유튜브 고유번호'
    , `member_no`            INT NOT NULL COMMENT '작성자 고유번호 (FK: MEMBER.member_no)'
    , `clip_id`                VARCHAR(50) NOT NULL COMMENT '클립의 ID' COLLATE 'utf8mb3_general_ci'
    , `channel_id`            VARCHAR(50) NOT NULL COMMENT '채널의 ID' COLLATE 'utf8mb3_general_ci'
    , `author`                VARCHAR(255) NULL COMMENT '등록자' COLLATE 'utf8mb3_general_ci'
    , `title`                VARCHAR(1000) NULL COMMENT '클립의 제목' COLLATE 'utf8mb3_general_ci'
    , `length`                INT NULL COMMENT '시간 (초)'
    , `publish_date`        DATE NULL COMMENT '클립 등록일'
    , `thumbnail_url`        VARCHAR(1000) NULL COMMENT '썸네일 이미지 주소 정보' COLLATE 'utf8mb3_general_ci'
    , `description`            MEDIUMTEXT NULL COMMENT '클립 상세 설명' COLLATE 'utf8mb3_general_ci'
    , `reg_date`            DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP() COMMENT '클립 정보 등록시각'

    , PRIMARY KEY (`clip_no`) USING BTREE
    , UNIQUE INDEX `UK_CLIP_ID` (`clip_id`) USING BTREE
)
COMMENT='작품 기본 정보 테이블'
COLLATE='utf8mb3_general_ci'
ENGINE=InnoDB
;

"MEDIUMTEXT" 자료형을 "MEDIUMBINARY" 형식으로 변경하면, 오류 없이 잘 입력되었습니다.

그래서 이건 "COLLATE" 문제라는 것이 직감되어, 관련 내용을 찾아 보니 유튜브나 SNS 등에서 이모지의 사용 빈도가 늘어나면서 이모지가 사용된 문자열 저장을 위하여 "utf8mb4"로 COLLATE가 확장된 것이었습니다.

기존 "UTF-8"은 "utf8mb3"으로 1문자를 저장하기 위해 1 ~ 3의 가변 바이트를 사용하게 되는데, 이모지 문자를 위해서는 "utf8mb4"로 지정하고 이는 1 ~ 4의 가변 바이트로 문자열을 처리하게 됩니다.

따라서 해결 방법은 아주 간단했습니다.

뒤 테이블에서 "utf8mb3"를 모두 "utf8mb4"로 변경하면, 이모지가 포함된 문자열도 잘 입력됩니다.

오랜만에 MariaDB와 연동하는 작업을 하다 보니, 변경된 내용에 대한 파악이 늦었습니다. 개발자는 새로운 것을 따라 진짜 계속 공부하는 수 밖에 없네요 ^^;


참고자료