MySQL utf8mb4 언어셋 소개 및 표현범위 & 서버 설정
페이지 정보
본문
과거 전세계 모든 언어는 3byte 로 모두 해결이 가능했습니다.
그래서 mySQL 과 mariaDB는 utf-8 을 3byte로 개발했습니다.
그러나 최근 추가된 이모티콘 언어 Emoji 의 문자열은 모두 4byte 입니다.
이로 인해서 이런 Emoji 글자가 저장되면 정상적으로 화면 표시가 안되게 됩니다.
mySQL 5.5.3 부터 4byte의 utf8mb4 라는 새로운 캐릭터셋이 추가됩니다.
다음은 권장하는 charset 과 collation 설정 값입니다.
1) mySQL 5.5.3 미만 => utf8 charset 에, utf8_general_ci collation 사용
2) mySQL 이 최신일 때 => utf8mb4 charset 에, utf8mb4_unicode_ci collation 사용
기존 utf8 시스템을 utf8mb4 로 바꾸어도 값의 손실은 없다고 합니다.
디비 시스템에서 utf8mb4 가 지원된다면 꼭 그것을 선택해서 사용하세요
utf8mb4: utf8은 emoji 문자가 입력되지 않는 charset이기 때문에, 추후 emoji를 사용했을 때 발생할 수 있는 문제를 없애기 위해 utf8mb4를 선택하였습니다.
utf8mb4_0900_ai_ci: mySQL 8.0 버전의 기본 collation입니다. 따로, 대소문자나 악섹트를 구분할 일이 없을 듯 하여 기본 collation을 선택했습니다.
unicode 9.0 문자를 표현(0900)
Accent Insensitive Mode(ai, 악센트 구분하지 않음)
Case Insensitive Mode(ci, 대소문자 구분하지 않음)
Charset과 Collation 기본 개념
[ Chatset ]
문자 집합을 뜻하며, 각 문자 집합의 크기를 어떻게 설정할 것인지 정하는 것입니다.
mySQL의 utf-8의 경우 3byte 가변 자료형으로 설계되어 있습니다.
이는, 전세계 언어가 3byte보다 크지 않아 설정한 자료형 크기입니다.
다만, 일반적인 언어가 아닐 때 4byte 문자열(ex: Emoji)이 존재하여 utf-8에 저장했을 때 값이 손실되는 현상이 발생했습니다.
이로 인해, utf8mb4이라는 4byte 가변 자료형을 저장할 수 있는 자료형을 추가했습니다. (mySQL 5.5.3에 추가).
[ Collation ]
Collation은 text data를 정렬(ORDER BY)할 때 사용합니다.
utf8_bin & utf8mb4_bin
바이너리 저장 값 그대로 정렬합니다.
즉, A는 41이고 B는 42, a는 61이기 때문에 오름차순 정렬 시 A가 a보다 먼저 오고 B가 온 뒤 a가 오게 됩니다.
utf8_general_ci & utf8mb4_general_ci
텍스트 정렬 시, 대소문자가 구분이 되지 않는 것이라고 생각할 수 있습니다.
즉, 악센트가 없어 A 순서에 a가 같이 오게 됩니다.
utf8_unicode_ci & utf8mb4_unitcode_ci
general_ci보다 좀 더 잘 정렬된 collation입니다.
한글이나 영어, 중국어 등에서는 general_ci나 unicode_ci 결과가 동일합니다.
다만, 악센트가 있는 문자와 같은 문자를 제대로 정렬할 필요성이 있을 때에는 unicode_ci를 사용해야 합니다.
관련문서
http://blog.mahler83.net/2016/10/mysql-charset-utf8_general_ci-vs-utf8mb4_general_ci/
http://stackoverflow.com/questions/30074492/what-is-the-difference-between-utf8mb4-and-utf8-charsets-in-mysql
https://blog.lael.be/post/917
http://yookeun.github.io/database/2015/07/21/mysql-utf8mb4/
https://earth-95.tistory.com/35
[ CentOS 6 ]
[root@localhost ~]# vi /etc/my.cnf
[client-server]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[ CentOS 7 ]
1. 현재 설정된 상태
[root@localhost ~]# mysql --version
mysql Ver 15.1 Distrib 10.2.12-MariaDB, for Linux (x86_64) using readline 5.1
[root@localhost ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.2.12-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show variables like "%character%"; show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | utf8_general_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.01 sec)
MariaDB [(none)]> exit
Bye
[root@localhost ~]#
2. server.cnf 설정
[root@localhost ~]# vi /etc/my.cnf.d/server.cnf
[client]
default-character-set=utf8mb4
[server]
character-set-server=utf8mb4
log-bin=mariadb-bin
event-scheduler=ON
[mysqld]
character-set-client-handshake = FALSE
collation-server = utf8mb4_unicode_ci
#init-connect='SET NAMES utf8mb4'
character-set-server = utf8mb4
max_allowed_packet = 32M
slow_query_log
long_query_time = 2
[mariadb-10.1]
innodb_file_format=barracuda
innodb_large_prefix=on
3. client.cnf 생성
[root@localhost ~]# vi /etc/my.cnf.d/client.cnf
[client]
default-character-set=utf8mb4
4. mysql-clients.cnf 수정
[root@localhost ~]# vi /etc/my.cnf.d/mysql-clients.cnf
[mysqldump]
default-character-set=utf8mb4
max_allowed_packet = 32M
5. MariaDB 재시작
[root@localhost ~]# systemctl restart mariadb
6. 적용된 모습
[root@localhost ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.2.12-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show variables like "%character%"; show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.01 sec)
MariaDB [(none)]> show variables like 'innodb_lar%';
+---------------------+-------+
| Variable_name | Value |
+---------------------+-------+
| innodb_large_prefix | ON |
+---------------------+-------+
1 row in set (0.00 sec)
MariaDB [(none)]> show variables like 'innodb_file%';
+--------------------------+-----------+
| Variable_name | Value |
+--------------------------+-----------+
| innodb_file_format | Barracuda |
| innodb_file_format_check | ON |
| innodb_file_format_max | Antelope |
| innodb_file_per_table | ON |
+--------------------------+-----------+
4 rows in set (0.00 sec)
MariaDB [(none)]> exit
Bye
[root@localhost ~]#
6. 주의
character-set-client-handshake 옵션은 클라이언트의 문자셋을 무시하고 서버쪽 문자셋을 이용하는 것이다.
만약 기존 데이터베이스나 테이블이 CHARSET이 UTF8로 되었다면 utf8mb4로 변경해야 한다.
ALTER DATABASE 디비이름 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE 테이블이름 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
참고자료
http://qiita.com/100/items/5a07ab0abcabd1296ef8
http://kimpaper.blogspot.kr/2015/02/mysql-mariadb-utf8mb4.html
https://www.lesstif.com/pages/viewpage.action?pageId=20775198
http://yookeun.github.io/database/2015/07/21/mysql-utf8mb4/
그래서 mySQL 과 mariaDB는 utf-8 을 3byte로 개발했습니다.
그러나 최근 추가된 이모티콘 언어 Emoji 의 문자열은 모두 4byte 입니다.
이로 인해서 이런 Emoji 글자가 저장되면 정상적으로 화면 표시가 안되게 됩니다.
mySQL 5.5.3 부터 4byte의 utf8mb4 라는 새로운 캐릭터셋이 추가됩니다.
다음은 권장하는 charset 과 collation 설정 값입니다.
1) mySQL 5.5.3 미만 => utf8 charset 에, utf8_general_ci collation 사용
2) mySQL 이 최신일 때 => utf8mb4 charset 에, utf8mb4_unicode_ci collation 사용
기존 utf8 시스템을 utf8mb4 로 바꾸어도 값의 손실은 없다고 합니다.
디비 시스템에서 utf8mb4 가 지원된다면 꼭 그것을 선택해서 사용하세요
utf8mb4: utf8은 emoji 문자가 입력되지 않는 charset이기 때문에, 추후 emoji를 사용했을 때 발생할 수 있는 문제를 없애기 위해 utf8mb4를 선택하였습니다.
utf8mb4_0900_ai_ci: mySQL 8.0 버전의 기본 collation입니다. 따로, 대소문자나 악섹트를 구분할 일이 없을 듯 하여 기본 collation을 선택했습니다.
unicode 9.0 문자를 표현(0900)
Accent Insensitive Mode(ai, 악센트 구분하지 않음)
Case Insensitive Mode(ci, 대소문자 구분하지 않음)
Charset과 Collation 기본 개념
[ Chatset ]
문자 집합을 뜻하며, 각 문자 집합의 크기를 어떻게 설정할 것인지 정하는 것입니다.
mySQL의 utf-8의 경우 3byte 가변 자료형으로 설계되어 있습니다.
이는, 전세계 언어가 3byte보다 크지 않아 설정한 자료형 크기입니다.
다만, 일반적인 언어가 아닐 때 4byte 문자열(ex: Emoji)이 존재하여 utf-8에 저장했을 때 값이 손실되는 현상이 발생했습니다.
이로 인해, utf8mb4이라는 4byte 가변 자료형을 저장할 수 있는 자료형을 추가했습니다. (mySQL 5.5.3에 추가).
[ Collation ]
Collation은 text data를 정렬(ORDER BY)할 때 사용합니다.
utf8_bin & utf8mb4_bin
바이너리 저장 값 그대로 정렬합니다.
즉, A는 41이고 B는 42, a는 61이기 때문에 오름차순 정렬 시 A가 a보다 먼저 오고 B가 온 뒤 a가 오게 됩니다.
utf8_general_ci & utf8mb4_general_ci
텍스트 정렬 시, 대소문자가 구분이 되지 않는 것이라고 생각할 수 있습니다.
즉, 악센트가 없어 A 순서에 a가 같이 오게 됩니다.
utf8_unicode_ci & utf8mb4_unitcode_ci
general_ci보다 좀 더 잘 정렬된 collation입니다.
한글이나 영어, 중국어 등에서는 general_ci나 unicode_ci 결과가 동일합니다.
다만, 악센트가 있는 문자와 같은 문자를 제대로 정렬할 필요성이 있을 때에는 unicode_ci를 사용해야 합니다.
관련문서
http://blog.mahler83.net/2016/10/mysql-charset-utf8_general_ci-vs-utf8mb4_general_ci/
http://stackoverflow.com/questions/30074492/what-is-the-difference-between-utf8mb4-and-utf8-charsets-in-mysql
https://blog.lael.be/post/917
http://yookeun.github.io/database/2015/07/21/mysql-utf8mb4/
https://earth-95.tistory.com/35
[ CentOS 6 ]
[root@localhost ~]# vi /etc/my.cnf
[client-server]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[ CentOS 7 ]
1. 현재 설정된 상태
[root@localhost ~]# mysql --version
mysql Ver 15.1 Distrib 10.2.12-MariaDB, for Linux (x86_64) using readline 5.1
[root@localhost ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.2.12-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show variables like "%character%"; show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | utf8_general_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.01 sec)
MariaDB [(none)]> exit
Bye
[root@localhost ~]#
2. server.cnf 설정
[root@localhost ~]# vi /etc/my.cnf.d/server.cnf
[client]
default-character-set=utf8mb4
[server]
character-set-server=utf8mb4
log-bin=mariadb-bin
event-scheduler=ON
[mysqld]
character-set-client-handshake = FALSE
collation-server = utf8mb4_unicode_ci
#init-connect='SET NAMES utf8mb4'
character-set-server = utf8mb4
max_allowed_packet = 32M
slow_query_log
[mariadb-10.1]
innodb_file_format=barracuda
innodb_large_prefix=on
3. client.cnf 생성
[root@localhost ~]# vi /etc/my.cnf.d/client.cnf
[client]
default-character-set=utf8mb4
4. mysql-clients.cnf 수정
[root@localhost ~]# vi /etc/my.cnf.d/mysql-clients.cnf
[mysqldump]
default-character-set=utf8mb4
max_allowed_packet = 32M
5. MariaDB 재시작
[root@localhost ~]# systemctl restart mariadb
6. 적용된 모습
[root@localhost ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.2.12-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show variables like "%character%"; show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.01 sec)
MariaDB [(none)]> show variables like 'innodb_lar%';
+---------------------+-------+
| Variable_name | Value |
+---------------------+-------+
| innodb_large_prefix | ON |
+---------------------+-------+
1 row in set (0.00 sec)
MariaDB [(none)]> show variables like 'innodb_file%';
+--------------------------+-----------+
| Variable_name | Value |
+--------------------------+-----------+
| innodb_file_format | Barracuda |
| innodb_file_format_check | ON |
| innodb_file_format_max | Antelope |
| innodb_file_per_table | ON |
+--------------------------+-----------+
4 rows in set (0.00 sec)
MariaDB [(none)]> exit
Bye
[root@localhost ~]#
6. 주의
character-set-client-handshake 옵션은 클라이언트의 문자셋을 무시하고 서버쪽 문자셋을 이용하는 것이다.
만약 기존 데이터베이스나 테이블이 CHARSET이 UTF8로 되었다면 utf8mb4로 변경해야 한다.
ALTER DATABASE 디비이름 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE 테이블이름 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
참고자료
http://qiita.com/100/items/5a07ab0abcabd1296ef8
http://kimpaper.blogspot.kr/2015/02/mysql-mariadb-utf8mb4.html
https://www.lesstif.com/pages/viewpage.action?pageId=20775198
http://yookeun.github.io/database/2015/07/21/mysql-utf8mb4/
댓글목록
등록된 댓글이 없습니다.