utf8mb4 언어셋 소개 및 표현범위 & 서버 설정 > 기술자료 | 해피정닷컴

utf8mb4 언어셋 소개 및 표현범위 & 서버 설정 > 기술자료

본문 바로가기

사이트 내 전체검색

utf8mb4 언어셋 소개 및 표현범위 & 서버 설정 > 기술자료

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/ 

댓글목록

등록된 댓글이 없습니다.


Total 2,640건 1 페이지
  • RSS
기술자료 목록
2640
그누보드   42  2024-11-22 10:52 ~ 2024-11-22 11:03  
2639
호스팅   73  2024-11-19 14:41 ~ 2024-11-19 21:17  
2638
Linux   67  2024-11-18 15:45 ~ 2024-11-18 15:48  
2637
일반   78  2024-11-15 16:45 ~ 2024-11-15 16:46  
2636
Secure   126  2024-11-06 18:48 ~ 2024-11-06 18:50  
2635
영카트   264  2024-10-21 13:44 ~ 2024-10-21 19:42  
2634
전자결제   508  2024-09-05 09:30  
2633
MySQL   932  2024-03-29 14:14 ~ 2024-03-29 14:14  
2632
그누보드   1152  2024-02-23 18:40 ~ 2024-02-24 06:13  
2631
JavaScript   1259  2024-02-16 18:50 ~ 2024-02-16 20:37  
2630
Java   1195  2024-02-06 16:49  
2629
PHP   1382  2024-02-06 16:42  
2628
호스팅   1225  2024-01-29 12:54  
2627
PHP   1291  2024-01-26 11:04 ~ 2024-01-26 11:13  
2626
MySQL   1488  2024-01-08 17:37 ~ 2024-03-14 16:00  
2625
SQL   1584  2024-01-08 12:36  
2624
영카트   1656  2024-01-04 14:57  
2623
일반   2565  2023-12-15 18:33  
2622
Android   2057  2023-11-30 18:48 ~ 2023-11-30 19:41  
2621
전자결제   4004  2023-11-23 19:53  

검색

해피정닷컴 정보

회사소개 회사연혁 협력사 오시는길 서비스 이용약관 개인정보 처리방침

회사명: 해피정닷컴   대표: 정창용   전화: 070-7600-3500   팩스: 042-670-8272
주소: (34368) 대전시 대덕구 대화로 160 대전산업용재유통단지 1동 222호
개인정보보호책임자: 정창용   사업자번호: 119-05-36414
통신판매업신고: 제2024-대전대덕-0405호 [사업자등록확인]  
Copyright 2001~2024 해피정닷컴. All Rights Reserved.