개요

MySQL 의 default character set 은 MySQL 의 설정 파일에 설정할 수 있다.

배포판위치
RHEL/CentOS /etc/my.cnf
Ubuntu /etc/mysql/mysql.conf.d/mysqld.cnf


캐릭터 셋을 명시적으로 설정하지 않으면 MySQL 5.7 이하는  latin1, MySQL 8은 utf8mb4 가 된다. 현재 character set 확인은 다음과 같이 mysql 클라이언트로 연결한 후에 status 명령어로 알수 있다.

또는 다음과 같이 mysql 콘솔에서 show variable 을 사용해도 된다.

mysql> show variables like 'char%';
CODE


redmine, gitlab 등 거의 모든 app 들은 character set 으로 UTF-8 을 권장하고 있고 실제로도 UTF-8 을 사용하는게 정신건강에 좋다.

MySQL 5.1 과 5.5 이상은 my.cnf 에 캐릭터 셋 설정하는 방식이 약간 다르다.


MySQL 은 UTF-8 은 3 byte 문자밖에 표시하지 못하므로 아래에서 설명할 utf8mb4 인코딩을 사용하는 것을 권장.!


설정

MySQL 8

MySQL 5.5 이상

MySQL 5.5 부터는 default-character-set 옵션이 제거되었고 character-set-server 만 설정해 주면 된다.

skip-character-set-client-handshake 가 빠지면 client 의 시스템 encoding 을 사용하는데 윈도의 경우 euckr 로 설정 될수 있으므로 필요하다.

MySQL 5.5

[mysqld]
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4
skip-character-set-client-handshake
CODE


이제 service mysqld restart 로 재구동후에 mysql client 에서 status 명령어로 보면 charset 이 utf-8mb4 로 변경되었을 것이다.


MySQL 5.1

5.1 은 다음과 같이 설정해야 한다.

MySQL 5.1

[mysqld]
character-set-server = utf8
 
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

BASH

이모지 지원을 위한 UTF8MB4 인코딩

MySQL 8 은 기본 character set 과 collation 이 utf8mb4과 utf8mb4_0900_ai_ci이므로 아래 내용을 별도로 설정할 필요가 없다.


MySQL 은 UTF-8 구현을 대충 해서 3 Byte 밖에 표현을 못하는 문제가 있었는데 Emoji 가 활성화되면서 4 byte 로 표현해야 하는 UTF-8 문자들에 대한 요구가 많아졌다.

그래서 다른 DBMS 와는 달리 MySQL 은 utf8mb4 라는 4byte 를 표현하는 새로운 캐릭터 셋을 만들었으니 Emoji 나 기타 4 byte 로 인코딩하는 UTF-8 문자를 MySQL 에 저장하려면  utf8mb4 인코딩을 사용해야 한다. (MySQL 5.5.3 이상 필요)

utf8mb4 캐릭터 셋은 오직 MySQL 에만 해당되는 문제이고 다른 DBMS 는 아예 utf8mb4 라는 캐릭터 셋이 없으며 보통 인코딩을 UTF-8 로 설정하면 된다.

[mysqld]
collation-server = utf8mb4_unicode_ci
## MySQL 8 은 기본 collation 이 변경됨
# collation-server = utf8mb4_0900_ai_ci
character-set-server = utf8mb4
skip-character-set-client-handshake
CODE


기존 DB Migration


이미 기존에 만들어진 database 라면 alter database 명령어로 캐릭터 셋과 collate 를 변경할 수 있다.

MySQL 5.7 이하 character set 변경

ALTER DATABASE homestead CHARACTER SET = utf8mb4;
SQL


MySQL 8 에 새로 도입된 utf8mb4_0900_ai_ci Collation 을 사용하도록 변경할 수 있지만 collation 변경은 Primary key, unique constraint 등 여러 부분에 영향을 미치므로 주의해서 변경해야 한다.

MySQL 5.7 이하 character set 변경

ALTER DATABASE homestead CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;
SQL


같이 보기

Ref