ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Maria DB (MySQL 포함) 이모지 입력 버그 해결
    소프트웨어개발 이야기 2020. 4. 21. 16:27

    최근 커뮤니티 데이터 수집 프로젝트를 진행 중인데, 사용자가 작성한 내용을 DB에 입력하는 부분에서 에러가 종종 발생했다. 원인을 파악해 보니, 이모지(emoji) 문자열을 DB에 입력하면서 문자셋(Charset)이 맞지 않아 발생하는 이슈였다.

    2000년대 초반, PC 통신에서 인터넷으로 넘어가던 시대의 "한글 깨짐"을 경험한 개발자에겐 데자뷰같은 기분이다.

     

    로그 파일에서는 아래와 같은 에러 메세지를 확인할 수 있다.

    mysql> ERROR 1366 (HY000) : incorrect string value : ''\xED\x95\xB0...' for column 'content' at row 1

    필드에 적합하지 않은 데이터의 입력 때문에 발생하며, 1366 에러 코드를 출력한다.

    4바이트로 구성된 이모지는 4바이트를 표현할 수 있는 utf8 문자셋으로 입력이 가능하지만, 안타깝게도 Maria DB(MySQL 포함)에서는 utf8을 3바이트로 처리하고 있어 이와 같은 문제가 발생한다.

    결론부터 말하자면,
    euc-kr을 utf8로 해결했듯이 문자셋을 utf8mb4로, 정렬방식(Collation)을 utf8mb4_unicode_ci로 변경하면 된다.

    자세한 해결방법은 아래와 같다.


    1. 퀴리실행을 통해 DB의 문자셋과 정렬 방식을 utf8mb4로 변경한다.

    ALTER TABLE `테이블명` 
    CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_unicode_ci ;

     

    2. 환경파일 수정을 통해 DBMS의 파라미터 정보를 변경한다.

    // my.cnf 환경파일 수정
    
    [mysqld]
    . . .
    default-character-set=utf8mb4
    default-collation=utf8mb4_unicode_ci
    . . .

    * 클라우드 서비스를 사용할 경우 위처럼 환경 파일 직접 변경이 불가하므로, 아래의 AWS RDS처럼 구성 파라미터 정보에서 해당 속성을 찾아 변경한다.

     

    3. Application의 DB 클라이언트 접속 정보에 문자셋을 utf8mb4로 변경한다.
    이모지 1366 에러를 구글링해보면, 대부분 1~2번에 해당하는 해결 방법만 검색된다. Application을 사용해서 DB에 이모지를 입력하는 경우 DB 정보면 변경해서는 절대 해결이 안 된다.(필자가 이것 때문에 고생한 걸 생각하면 눙물이...)
    이는 DB 클라이언트의 문자셋 기본값이 utf8mb4가 아니기 때문이며 이를 위해 아래와 같이 속성을 추가한다. 필자의 경우 NodeJs의 mysql 라이브러리를 사용하고 있다.

        config = config || {
          connectionLimit: 10,
          host: configs.get('DB.host'),
          user: configs.get('DB.username'),
          password: configs.get('DB.password'),
          database: configs.get('DB.dbname'),
          debug: configs.get('DB.debug'),      
          charset: 'utf8mb4'
        };
        
        this.pool = mysql.createPool(config);

     

    댓글

Designed by Joypinkgom.