DB & AWS Knowledge
MySQL, MariaDB 의 character set (charset) 설정 : euc-kr, utf8, utf8mb4 본문
MySQL, MariaDB 의 character set (charset) 설정 : euc-kr, utf8, utf8mb4
`O` 2024. 1. 14. 23:36해당 페이지에서는 MySQL, MariaDB 을 구성하면서 사용 할 수 있는 대표 charset 인 euc-kr, utf8, utf8mb4 에 대하여 다룬다,
또한 이 페이지는 아래의 MySQL 공식 Document 를 참조한다.
[1] https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_character_set_connection
Euc-kr, utf8, utf8mb4 사용 시, 공통점
쉽게 결론부터 말하면 euc-kr, utf8, utf8mb4 는 모두 한글 등의 특수 언어를 사용 할 수 있는 대표적인 character set 이다. 예전 MySQL, MariaDB 버전들은 기본 charset 이 latin1 로 설정되었고 이 charset 는 한글을 지원하지 않았기에 사용자가 이를 그대로 사용하면 한글을 사용 할 수 없었다. (데이터 입력은 가능하나 조회 시, ? 로 결과가 나왔다)
그래서 사용자가 이를 바꾸기 위해서 euc-kr, utf8, utf8mb4 중 하나를 선택하여 사용함으로써 한글을 사용할 수 있었다.
그러나 이중 euckr, utf8 은 기능적으로 제한적인 사항이 있어서 현재 최신버전들은 [1] 의 내용과 같이 utf8mb4 이 기본 charset 으로 설정 되었다.
Euc-kr, utf8 의 제한사항
euckr, utf8 의 대표적인 제한사항은 아래와 같다.
- euc-kr
한글을 사용할 수 있는 charset 이면서 utf8 과 함께 사용자에게 익숙한 charset 이여서 자주 쓰이는 charset 중 하나다.
그러나 euc-kr 은 아래 테스트와 같이 MySQL, MariaDB 에서 일부 언어가 지원되지 않는다. (예: 프랑스어, 스페인어)
- utf8, utfmb4
두 charset 은 기본적으로 utf8 을 base 로 사용하고 이에 따라 위의 언어들도 지원 할 수 있어서 이를 표준으로 사용하면 좋다. 그러나 utf8 은 가변 바이트라 하여 한글자를 표현하는데 사용되는 byte 를 사용 시 3 byte 를 사용하는데 이 3 byte 로는 서비스에서 이모티콘을 표현하는데 필요한 byte 인 4byte 를 충족할 수 없기에 서비스에서 이모티콘 사용에 대한 제한사항이 생긴다.
이러한 제한 사항을 극복하기 위해 사용하는 charset 이 utfmb4 다. 결국 최종적으로 모든 관련 제한사항을 극복한 charset 이 utf8mb4 이기에 현재 최신 MySQL 버전 들에서 기본 charset 을 아에 utf8mb4 로 설정 한 것이다.
아래의 내용은 위의 사항들을 총합적으로 볼 수 있는 테스트이다. (필자가 직접 수행)
[테스트]
- Test table 생성
MySQL [test]> show create table test;
+-------+----------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------+
| test | CREATE TABLE `test` (
`chr` varchar(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
- Charset, collation 환경을 아래와 같이 맞추고 이에 따른 테스트용 schema 재생성
MySQL [(none)]> show variables like '%char%';
+--------------------------+------------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+------------------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | euckr |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | euckr |
| character_set_system | utf8 |
| character_sets_dir | /rdsdbbin/oscar-5.7.mysql_aurora.2.08.3.0.2254.0/share/charsets/ |
+--------------------------+------------------------------------------------------------------+
MySQL [(none)]> show variables like '%collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | euckr_bin |
| collation_server | euckr_bin |
+----------------------+-----------------+
3 rows in set (0.00 sec)
- 이에 따른 table 생성 및 테스트 재 수행
MySQL [test]> create table test (chr varchar(1));
Query OK, 0 rows affected (0.03 sec)
MySQL [test]> show create table test;
+-------+---------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------------------------+
| test | CREATE TABLE `test` (
`chr` varchar(1) COLLATE euckr_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=euckr COLLATE=euckr_bin |
+-------+---------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
MySQL [test]> insert into test values ('Á');
Query OK, 1 row affected, 1 warning (0.01 sec)
MySQL [test]> insert into test values ('É');
Query OK, 1 row affected, 1 warning (0.01 sec)
MySQL [test]> select * from test;
+------+
| chr |
+------+
| ? |
| ? |
+------+
2 rows in set (0.00 sec)
- CHARSET, COLLATE 를 UTF8MB4 로 고정하고 테스트 수행
MySQL [test]> create table test2 (chr varchar(1)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
Query OK, 0 rows affected (0.04 sec)
MySQL [test]> show create table test2;
+-------+----------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------------------------------------------------------------------+
| test2 | CREATE TABLE `test2` (
`chr` varchar(1) COLLATE utf8mb4_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |
+-------+----------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
MySQL [test]> insert into test2 values ('Á');
Query OK, 1 row affected (0.01 sec)
MySQL [test]> insert into test2 values ('É');
Query OK, 1 row affected (0.02 sec)
MySQL [test]> select * from test2;
+------+
| chr |
+------+
| Á |
| É |
+------+
2 rows in set (0.01 sec)
'MySQL > 기타 지식' 카테고리의 다른 글
MySQL 의 foreign key 와 Index 의 관계 (0) | 2024.01.17 |
---|---|
MySQL, MariaDB 의 signal crash (0) | 2024.01.11 |
MySQL, MariaDB 내 lower_case_table_names 사용 시 주의 사항 (0) | 2023.09.17 |
Explain for connection 기능과 제한 사항 (0) | 2023.07.06 |
MySQL및 MariaDB 에서의 max_open_files 및 open_files_limit 의 의의와 AWS RDS, Aurora Cluster 의 제한 사항 (0) | 2023.03.15 |