ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MySQL 데이터베이스의 characterset 언어를 UTF8로 변경하기
    Knowledge 2019. 9. 30. 14:19

    MySQL

     

    여전히 간단하게 사용하기에는 가장 좋은 관계형 데이터베이스는 MySQL인 것 같다. 그런데 MySQL에서 가장 흔히 하는 실수가 기본 언어셋을 변경하지 않는 것이다. 과거의 유물이어서 그런 탓이겠지만 MySQL의 기본 언어는 latin1으로 설정이 된다.

     

    MySQL을 설치한 상태에서 DB를 만들고 사용하면 한글이나 다른 유니코드 데이터가 깨지는 것을 경험할 수 있다. 이런 상황이 벌어지면 DB 설정문제라는 생각을 떠올리기 전에 만든 코드가 잘못되었는지 먼저 체크하게 되는 것이 개발자의 본능이기에 설치 후에는 잊지 말고 MySQL의 언어셋을 변경해 주어야 한다.

     

    MySQL 설정 파일인 my.cnf 파일을 연다. 의도적으로 위치를 변경하지 않았다면 우분투에서의 설정 파일의 위치는 다음과 같다.

    $ vi /etc/mysql/my.cnf

     

    파일 내용의 마지막에 다음 부분을 덧붙여준다.

    ...
    
    [client]
    default-character-set=utf8
    
    [mysql]
    default-character-set=utf8
    
    [mysqld]
    collation-server = utf8_unicode_ci
    init-connect='SET NAMES utf8'
    character-set-server = utf8

     

    설정 내용을 적용하기 위해 MySQL을 재시작한다.

    $ /etc/init.d/mysql restart

     

    잘 적용이 되었는지 확인을 하기 위해 먼저 MySQL에 접속한다.

    $ sudo mysql -u root -p

     

    MySQL 콘솔에 들어가게 되면 다음 명령을 입력한다.

    mysql> status

     

    현재 status 중 characterset 부분이 utf8로 변경이 되어있는지 확인한다.

    ...
    Protocol version:	10
    Connection:		Localhost via UNIX socket
    Server characterset:	utf8
    Db     characterset:	utf8
    Client characterset:	utf8
    Conn.  characterset:	utf8
    UNIX socket:		/var/run/mysqld/mysqld.sock
    ...

     

    그런데, 최근에는 모바일을 중심으로 4byte UTF8 문자를 많이 사용한다. Emoji의 사용이 대표적인 케이스이다.

    4byte 문자가 입력으로 들어올 경우 UTF8로 설정한 MySQLER_TRUNCATED_WRONG_VALUE_FOR_FIELD 에러를 출력한다.

     

    이는 MySQL이 기본적으로 3byte의 UTF8을 사용하기 때문이다.

    UTF8은 기본적으로 1~4 바이트의 가변 문자열이나, 당시 mysql은 전세계 언어가 21비트 정도에 다 들어가므로 공간을 낭비할 필요 없이 3바이트면 충분한 크기라고 생각했던 것 같다.

    그러나 Emoji가 등장하면서 순식간에 4byte UTF8이 폭발적으로 사용되니, 세상의 빠름이 예상을 뛰어넘게 된다.

     

    아무튼 이를 해결하기 위해 mysql은 2010년 3월 24일 부랴부랴 utf8mb4 캐릭터셋을 추가한다. (MySQL 5.3.3)

    이를 적용하기 위해서는 my.cnf를 다음과 같이 수정해 주어야 한다.

    ...
    
    [client]
    default-character-set = utf8mb4
    
    [mysql]
    default-character-set = utf8mb4
    
    [mysqld]
    character-set-client-handshake = FALSE
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci

     

    이후 설정 적용을 위해서는 MySQL을 재시작해야 한다.

    이미 UTF8로 설정된 기존 데이터베이스나 테이블이 있을 경우 다음 명령을 통해 컬럼값을 수정한다.

    ALTER DATABASE <database_name> CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
    ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

     

    이제 MySQL이 4byte UTF8 문자 입력에도 잘 반응할 것이다.

     

     

    Fin.

    반응형

    댓글

Calvin's Memo