gbmin's Tech Notes

서버 구축 및 유지보수, 클라우드 컴퓨팅, 네트워크 보안, IT 분야 기술 노트. :)

Tech Notes/Mysql & MariaDB

Mysql & MariaDB 캐릭터 셋(Character Set) 개념과 변경 방법

gbmin 2023. 7. 14. 13:58

MySQL과 MariaDB는 가장 많이 사용되는 오픈 소스 관계형 데이터베이스 관리 시스템(RDBMS) 중 하나다. 웹 기반 애플리케이션, 데이터 웨어하우싱, E-Commerce 및 로그 분석 등에 널리 사용되며, 그 유연성과 안정성으로 인해 선호받고 있다. 하지만 이와 같은 프로그램과 연동하면서 잘못된 캐릭터 셋 설정으로 인해 저장되는 문자열이 깨지거나 데이터를 불러올 때 캐릭터 셋이 맞지 않아 글자가 깨지는 경우가 종종 발생된다. 이런 문제의 해결을 위해 MySQL과 MariaDB에서 캐릭터 셋 의 개념과 변경 방법에 대해서 정리하였다.


[목차]

1. 캐릭터 셋(Character Set) 은 무엇인가?

2. 서버 내 지원하는 캐릭터 셋을 확인하는 방법

3. MYSQL & MariaDB 서버 내 설정하는 캐릭터 셋의 의미

4. 캐릭터 셋 변경 방법

5. 한글 사용을 위한 캐릭터 셋 설정


 

1. 캐릭터 셋(Character Set) 은 무엇인가?

캐릭터 셋(Character Set은 MySQL이나 MariaDB에서 문자 데이터를 표현하는 방법을 정의하는 것이며, 특정 문자 집합에 대한 식별자와 각 문자를 어떻게 인코딩할지 결정하는 방법을 포함한다. 즉, 캐릭터 셋은 데이터베이스에서 문자열 데이터를 어떻게 해석하고 저장할지를 결정하는 규칙이라고 보면 된다. 캐릭터 셋은 데이터베이스 시스템에서 문자열 데이터를 일관되게 처리하고 정확하게 표현하는 핵심적인 역할을 하고 있다. 만약 데이터베이스가 올바른 캐릭터 셋 을 사용하지 않는다면, 데이터가 잘못 해석되거나 손실될 수 있다. 따라서, 상황에 따라 개발환경에 맞는 캐릭터 셋을 변경하여 설정해야 할 필요가 있다.

 

 

2. 서버 내 지원하는 캐릭터 셋을 확인하는 방법

MySQL 서버에서 사용 가능한 캐릭터 셋를 확인하려면 SHOW CHARACTER SET; 명령을 사용하면 된다. 이 명령은 MySQL 서버에서 지원하는 모든 캐릭터 셋의 목록을 제공한다.

 

각 칼럼의 의미
Charset : 캐릭터 셋의 이름
Description : 설명
Default collation : 기본 규칙
Maxlen : 문자의 범위

MariaDB [(none)]> SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |
| dec8     | DEC West European           | dec8_swedish_ci     |      1 |
| cp850    | DOS West European           | cp850_general_ci    |      1 |
| hp8      | HP West European            | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European        | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                    | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese             | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese          | sjis_japanese_ci    |      2 |
| hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |      1 |
| tis620   | TIS620 Thai                 | tis620_thai_ci      |      1 |
| euckr    | EUC-KR Korean               | euckr_korean_ci     |      2 |
| koi8u    | KOI8-U Ukrainian            | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek            | greek_general_ci    |      1 |
| cp1250   | Windows Central European    | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |      1 |
| armscii8 | ARMSCII-8 Armenian          | armscii8_general_ci |      1 |
| utf8mb3  | UTF-8 Unicode               | utf8mb3_general_ci  |      3 |
| ucs2     | UCS-2 Unicode               | ucs2_general_ci     |      2 |
| cp866    | DOS Russian                 | cp866_general_ci    |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak  | keybcs2_general_ci  |      1 |
| macce    | Mac Central European        | macce_general_ci    |      1 |
| macroman | Mac West European           | macroman_general_ci |      1 |
| cp852    | DOS Central European        | cp852_general_ci    |      1 |
| latin7   | ISO 8859-13 Baltic          | latin7_general_ci   |      1 |
| utf8mb4  | UTF-8 Unicode               | utf8mb4_general_ci  |      4 |
| cp1251   | Windows Cyrillic            | cp1251_general_ci   |      1 |
| utf16    | UTF-16 Unicode              | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode            | utf16le_general_ci  |      4 |
| cp1256   | Windows Arabic              | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic              | cp1257_general_ci   |      1 |
| utf32    | UTF-32 Unicode              | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset       | binary              |      1 |
| geostd8  | GEOSTD8 Georgian            | geostd8_general_ci  |      1 |
| cp932    | SJIS for Windows Japanese   | cp932_japanese_ci   |      2 |
| eucjpms  | UJIS for Windows Japanese   | eucjpms_japanese_ci |      3 |
+----------+-----------------------------+---------------------+--------+
40 rows in set (0.000 sec)

 

 

3. MYSQL & MariaDB 서버 내 설정하는 캐릭터 셋의 의미

MYSQL & MariaDB를 설치하면 서버정보에 이와 같이 4개의 캐릭터 셋 정보가 있다.

Server characterset

MySQL 서버의 전체적인 기본 캐릭터 셋을 의미한다. 즉, 서버 수준에서 새로 생성되는 모든 데이터베이스와 테이블이 이 캐릭터 셋을 기본으로 사용하게 된다.

 

Db characterset

특정 데이터베이스의 기본 캐릭터 셋 을 가리킨다. 데이터베이스 내에서 새로 생성되는 테이블은 이 캐릭터 셋을 기본으로 사용한다.

 

Client characterset

MySQL 클라이언트와 서버 간의 통신에 사용되는 캐릭터 셋을 의미한다. 클라이언트에서 전송된 쿼리와 서버에서 반환된 결과는 이 캐릭터 셋으로 인코딩 된다.

 

Conn. characterset

현재 연결의 캐릭터 셋을 의미한다. 이것은 'Client characterset'와 유사하지만, 특정 연결 세션에만 적용된다.

 

MariaDB [(none)]> \s
--------------
mysql from 11.0.2-MariaDB, client 15.2 for Linux (x86_64) using readline 5.1

Connection id:          1038
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server:                 MariaDB
Server version:         11.0.2-MariaDB MariaDB Server
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8mb3
Conn.  characterset:    utf8mb3
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 15 days 18 hours 22 min 2 sec

Threads: 1  Questions: 36666  Slow queries: 0  Opens: 31  Open tables: 12  Queries per second avg: 0.026
--------------

 

 

4. 캐릭터 셋 변경 방법

utf8mb4'로 변경하는 예제로 작성되었다.

 

전역 설정

서버의 설정에 따라 다르지만 /etc/my.cnf.d/server.cnf 또는 /etc/my.cnf 설정을 통해 전역 설정이 가능하다.

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

 

설정을 적용한 후에는 MySQL 서버를 재시작한다.

재시작이 불가피할 때는 SET NAMES 'utf8mb4'; 명령을 통해 현재 세션에만 적용 가능하다. 하지만 /etc/my.cnf 파일에 전역 설정 후 서비스 재시작을 하는 것을 권장한다.

 

데이터 베이스의 캐릭터 셋을 변경하는 방법

ALTER DATABASE [database_name] CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

 

테이블의 캐릭터 셋을 변경하는 방법

ALTER TABLE [table_name] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

 

DB 서버 기본 캐릭터 셋이 아닌 utf8mb4 로 지정하여 DB를 생성

CREATE DATABASE [database_name] CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

 

DB 기본 캐릭터 셋이 아닌 utf8mb4 로 지정하여 테이블 를 생성

CREATE TABLE [table_name] (
    id INT AUTO_INCREMENT,
    name VARCHAR(100),
    description TEXT,
    PRIMARY KEY (id)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

 

 

5. 한글 사용을 위한 캐릭터 셋 설정

utf8

utf8은 유니코드를 지원하며, 이 중에서도 한글을 포함한 많은 언어를 지원한다. utf8 캐릭터 셋은 각 문자를 최대 3바이트까지 지원하기 때문에, 대부분의 한글 문자를 처리할 수 있다. 그러나 이모티콘이나 이모지과 같은 4바이트 문자는 지원하지 않는다.

utf8mb4

utf8mb4 캐릭터 셋은 utf8의 확장 버전으로, 각 문자를 최대 4바이트까지 지원한다. utf8에서 지원하지 않는 문자, 예를 들어 이모티콘과 이모지 같은 4바이트 문자를 지원한다. 또한, 한글을 포함한 모든 유니코드 문자를 처리할 수 있다.
단 utf8mb4를 지원하는 버전은 MYSQL 5.5.3부터이며, MariaDB는 5.5 버전부터 지원하기 시작했다.

euc-kr 도 한글을 지원하지만, utf8이나 utf8mb4에 비해 지원하는 문자 범위가 제한적이라 최근에는 사용하지 않는 추세이다.