본문 바로가기
DBMS

MariaDB 캐릭터셋 변경하기

by developer's warehouse 2024. 1. 4.

이 글에서는 MariaDB의 캐릭터셋을 변경하는 방법에 대해서 알아봅니다.

MariaDB 캐릭터셋 변경하기 썸네일

1. MariaDB에서 사용 가능한 캐릭터셋 확인하기

MariaDB에서 사용가능한 캐릭터셋은 다음 구문을 통해서 확인할 수 있습니다.

SHOW CHARACTER SET;

 

SHOW CHARACTER SET; 명령어의 결과는 MariaDB에서 사용 가능한 모든 캐릭터셋에 대한 정보를 보여줍니다. 결과에는 다음과 같은 컬럼이 포함됩니다.

  • Charset: 캐릭터셋의 이름입니다.
  • Description: 캐릭터셋에 대한 설명입니다.
  • Default collation: 해당 캐릭터셋의 기본 정렬 순서입니다. 정렬 순서는 문자열 비교 시 어떤 문자가 먼저 오는지 결정하는 규칙을 의미합니다.
  • Maxlen: 캐릭터셋에서 하나의 문자를 표현하는 데 필요한 최대 바이트 수입니다

 

아래는 위의 구문을 실행한 결과입니다. 제일 앞 부분에 Charset이 사용가능한 캐릭터셋입니다.

MariaDB [tpcc]> 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.002 sec)

MariaDB [tpcc]>

 

현재 캐릭터셋을 확인하기 위해서는 다음 명령을 통해서 확인할 수 있습니다.

show variables like 'c%';

 

아래에 명령 수행 결과를 보면 utf8mb로 되어있어서 UTF-8 Unicode 캐릭터셋으로 설정된 것을 확인할 수 있습니다.

MariaDB [tpcc]> show variables like 'c%';
+----------------------------------+----------------------------+
| Variable_name                    | Value                      |
+----------------------------------+----------------------------+
| character_set_client             | utf8mb3                    |
| character_set_connection         | utf8mb3                    |
| character_set_database           | utf8mb4                    |
| character_set_filesystem         | binary                     |
| character_set_results            | utf8mb3                    |
| character_set_server             | utf8mb4                    |
| character_set_system             | utf8mb3                    |
| character_sets_dir               | /usr/share/mysql/charsets/ |
| check_constraint_checks          | ON                         |
| collation_connection             | utf8mb3_general_ci         |
| collation_database               | utf8mb4_general_ci         |
| collation_server                 | utf8mb4_general_ci         |
| column_compression_threshold     | 100                        |
| column_compression_zlib_level    | 6                          |
| column_compression_zlib_strategy | DEFAULT_STRATEGY           |
| column_compression_zlib_wrap     | OFF                        |
| completion_type                  | NO_CHAIN                   |
| concurrent_insert                | AUTO                       |
| connect_timeout                  | 10                         |
| core_file                        | OFF                        |
+----------------------------------+----------------------------+
20 rows in set (0.002 sec)

 

MariaDB의 SHOW VARIABLES 명령어는 서버의 시스템 변수를 보여줍니다. 여기서 LIKE 'c%'는 변수 이름이 'c’로 시작하는 모든 변수를 필터링합니다. 각 변수의 의미는 다음과 같습니다:

  • character_set_client: 클라이언트에서 보낸 문자열 데이터의 캐릭터셋입니다.
  • character_set_connection: 클라이언트와 서버 간 연결에 사용되는 캐릭터셋입니다.
  • character_set_database: 현재 데이터베이스의 기본 캐릭터셋입니다.
  • character_set_filesystem: 파일시스템에 대한 캐릭터셋입니다.
  • character_set_results: 클라이언트에 반환되는 결과의 캐릭터셋입니다.
  • character_set_server: 서버의 기본 캐릭터셋입니다.
  • character_set_system: 시스템 문자열에 대한 캐릭터셋입니다.
  • character_sets_dir: 캐릭터셋 정의 파일이 저장된 디렉토리의 경로입니다.
  • collation_connection: 클라이언트와 서버 간 연결에 사용되는 정렬 순서입니다.
  • collation_database: 현재 데이터베이스의 기본 정렬 순서입니다.
  • collation_server: 서버의 기본 정렬 순서입니다.

2.MariaDB 캐릭터셋을 설정파일로 변경하기

MariaDB에서 캐릭터셋을 변경하려면 다음과 같은 단계를 따르면 됩니다:

  1. MariaDB에 접속합니다. 터미널에서 다음 명령어를 입력합니다:
    sudo mysql -u root -p
    
  2. 현재 MariaDB의 캐릭터셋이 무엇인지 확인합니다. MariaDB 쉘에서 다음 명령어를 입력합니다:
    show variables like 'c%';
    
  3. MariaDB의 설정 파일을 수정합니다. 터미널에서 다음 명령어를 입력하여 설정 파일을 엽니다:
    sudo nano /etc/mysql/my.cnf
    #mariadb의 경우 다음의 디렉토리에 있는 파일로 설정파일이 있을 수 있습니다.
    sudo vi /etc/mysql/mariadb.cnf
  4. 설정 파일에 다음 내용을 추가하거나 수정합니다:
    [client]
    default-character-set=utf8
    
    [mysqld]
    # MySQL/MariaDB default is Latin1, but in Debian we rather default to the full
    # utf8 4-byte character set. See also client.cnf
    character-set-server  = ascii
    collation-server      = ascii_general_ci
    
    skip-character-set-client-handshake
    
    [mysql]
    default-character-set=utf8
  5. 설정 파일을 저장하고 닫습니다.
  6. MariaDB를 재시작합니다. 터미널에서 다음 명령어를 입력합니다:
    sudo service mysql restart
    
  7. 캐릭터셋이 제대로 변경되었는지 확인합니다. MariaDB 쉘에서 다음 명령어를 입력합니다:
    show variables like 'c%';
    
    
    MariaDB [(none)]>  show variables like 'c%';
    +----------------------------------+----------------------------+
    | Variable_name                    | Value                      |
    +----------------------------------+----------------------------+
    | character_set_client             | ascii                      |
    | character_set_connection         | ascii                      |
    | character_set_database           | ascii                      |
    | character_set_filesystem         | binary                     |
    | character_set_results            | ascii                      |
    | character_set_server             | ascii                      |
    | character_set_system             | utf8mb3                    |
    | character_sets_dir               | /usr/share/mysql/charsets/ |
    | check_constraint_checks          | ON                         |
    | collation_connection             | ascii_general_ci           |
    | collation_database               | ascii_general_ci           |
    | collation_server                 | ascii_general_ci           |
    | column_compression_threshold     | 100                        |
    | column_compression_zlib_level    | 6                          |
    | column_compression_zlib_strategy | DEFAULT_STRATEGY           |
    | column_compression_zlib_wrap     | OFF                        |
    | completion_type                  | NO_CHAIN                   |
    | concurrent_insert                | AUTO                       |
    | connect_timeout                  | 10                         |
    | core_file                        | OFF                        |
    +----------------------------------+----------------------------+
    20 rows in set (0.002 sec)

이제 MariaDB의 캐릭터셋이 UTF-8로 설정되었습니다. 이 방법은 MariaDB의 전체 캐릭터셋을 변경합니다. 특정 데이터베이스 또는 테이블의 캐릭터셋만 변경하려면 다른 방법을 사용해야 합니다. 또한, 이 방법은 MariaDB가 설치된 환경에 따라 달라질 수 있으므로, 해당 환경에 맞게 조정해야 합니다.

참고로, 캐릭터셋을 변경하면 데이터베이스에서 문자 데이터를 어떻게 인코딩하고 디코딩할지 결정하므로, 데이터의 일관성과 정확성에 중요한 영향을 미칩니다. 따라서 캐릭터셋을 변경하기 전에 반드시 백업을 수행하고, 변경 후에는 데이터가 제대로 표시되는지 확인해야 합니다.

 

3. 구문으로 캐릭터셋 변경하는 법

 

MariaDB에서 이미 생성된 데이터베이스의 캐릭터셋을 변경하려면 ALTER DATABASE 명령을 사용할 수 있습니다1. 아래는 기본적인 사용 방법입니다:

ALTER DATABASE database_name CHARACTER SET = utf8 COLLATE = utf8_general_ci;

위의 명령은 database_name이라는 데이터베이스의 캐릭터셋을 utf8로, 정렬 순서를 utf8_general_ci로 변경합니다. 이 명령을 실행하기 전에 반드시 해당 데이터베이스에 대한 쓰기 권한이 있는지 확인해야 합니다.

권한이 없는 경우 아래와 같은 에러가 발생합니다.

MariaDB [tpcc]> ALTER DATABASE database_name CHARACTER SET = ascii COLLATE = ascii_general_ci;
ERROR 1044 (42000): Access denied for user 'tpcc'@'%' to database 'database_name'

 

정상적으로 실행되면 다음과 같이 실행됩니다.

MariaDB [tpcc]> ALTER DATABASE tpcc CHARACTER SET = ascii COLLATE = ascii_general_ci;
Query OK, 1 row affected (0.001 sec)

 

그러나 이 명령은 데이터베이스 수준에서만 캐릭터셋을 변경하며, 이미 존재하는 테이블의 캐릭터셋은 변경하지 않습니다. 따라서 각 테이블의 캐릭터셋도 변경하려면, 각 테이블에 대해 ALTER TABLE 명령을 별도로 실행해야 합니다.

 

예를 들면 다음과 같습니다:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

위의 명령은 table_name이라는 테이블의 캐릭터셋을 utf8로, 정렬 순서를 utf8_general_ci로 변경합니다. 이 명령을 실행하기 전에 반드시 해당 테이블에 대한 쓰기 권한이 있는지 확인해야 합니다.

 

 

참고로, 캐릭터셋을 변경하면 데이터의 표현 방식이 바뀌므로, 데이터의 일관성과 정확성에 영향을 미칠 수 있습니다. 따라서 캐릭터셋을 변경하기 전에는 반드시 데이터를 백업하고, 변경 후에는 데이터가 제대로 표시되는지 확인해야 합니다.

 

다음과 같이 데이터 변환이 불가한 경우 에러가 날 수 도 있습니다.

MariaDB [tpcc]> show tables;
+----------------+
| Tables_in_tpcc |
+----------------+
| CUSTOMER       |
| DISTRICT       |
| Employees      |
| HISTORY        |
| ITEM           |
| NEW_ORDER      |
| ORDERS         |
| ORDER_LINE     |
| STOCK          |
| WAREHOUSE      |
+----------------+
10 rows in set (0.001 sec)

MariaDB [tpcc]> ALTER TABLE CUSTOMER    CONVERT TO CHARACTER SET ascii  COLLATE ascii_general_ci;
ERROR 1366 (22007): Incorrect string value: '\xE6\x88\x80\xE7\x94\x80...' for column `tpcc`.`CUSTOMER`.`C_DATA` at row 1
MariaDB [tpcc]> ALTER TABLE DISTRICT    CONVERT TO CHARACTER SET ascii  COLLATE ascii_general_ci;
Query OK, 10 rows affected (0.015 sec)
Records: 10  Duplicates: 0  Warnings: 0

MariaDB [tpcc]> ALTER TABLE Employees   CONVERT TO CHARACTER SET ascii  COLLATE ascii_general_ci;
Query OK, 1 row affected (0.013 sec)
Records: 1  Duplicates: 0  Warnings: 0

MariaDB [tpcc]> ALTER TABLE HISTORY     CONVERT TO CHARACTER SET ascii  COLLATE ascii_general_ci;
Query OK, 30062 rows affected (0.201 sec)
Records: 30062  Duplicates: 0  Warnings: 0

MariaDB [tpcc]> ALTER TABLE ITEM        CONVERT TO CHARACTER SET ascii  COLLATE ascii_general_ci;
Query OK, 100000 rows affected (0.550 sec)
Records: 100000  Duplicates: 0  Warnings: 0

MariaDB [tpcc]> ALTER TABLE NEW_ORDER   CONVERT TO CHARACTER SET ascii  COLLATE ascii_general_ci;
Query OK, 0 rows affected (0.007 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [tpcc]> ALTER TABLE ORDERS      CONVERT TO CHARACTER SET ascii  COLLATE ascii_general_ci;
Query OK, 0 rows affected (0.007 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [tpcc]> ALTER TABLE ORDER_LINE  CONVERT TO CHARACTER SET ascii  COLLATE ascii_general_ci;
Query OK, 301085 rows affected (2.876 sec)
Records: 301085  Duplicates: 0  Warnings: 0

MariaDB [tpcc]> ALTER TABLE STOCK       CONVERT TO CHARACTER SET ascii  COLLATE ascii_general_ci;
Query OK, 100000 rows affected (2.036 sec)
Records: 100000  Duplicates: 0  Warnings: 0

MariaDB [tpcc]> ALTER TABLE WAREHOUSE   CONVERT TO CHARACTER SET ascii  COLLATE ascii_general_ci;
Query OK, 1 row affected (0.020 sec)
Records: 1  Duplicates: 0  Warnings: 0
facebook twitter kakaoTalk kakaostory naver band shareLink