MySQL/기타 지식

MySQL, MariaDB 의 character set (charset) 설정 : euc-kr, utf8, utf8mb4

`O` 2024. 1. 14. 23:36
728x90
반응형

해당 페이지에서는 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)
반응형