본문 바로가기

MariaDB

MariaDB의 Character Set 및 Collation 종류 및 변경 방법

 

 
 

쿼리를 수행할 때 조건절이나 조인 시 문자열을 비교할 때, 각 테이블 및 칼럼의 문자정렬(Collaction)이 일치하지 않다면 쿼리 성능 저하가 올 수 있습니다.
그만큼, 문자셋과 문자정렬 방법은 모두 동일하게 운영하는 것이 좋습니다.

이번에는  MariaDB의 문자셋(Character Set)과 문자정렬(Collaction)에 대해서 작성해 보도록 하겠습니다.

문자셋(Charset)

MariaDB에서 문자셋은 데이터베이스에서 사용되는 문자의 인코딩을 정의하는 것입니다.
문자셋은 데이터를 검색하거나 문자를 저장할 때 어떻게 문자를 표현할지 결정합니다. 
 
MariaDB에서는 다양한 문자셋을 지원하며, 어떤 문자셋을 선택할지는 주로 데이터의 종류, 다국어 지원 여부, 성능, 저장 공간 효율 등을 고려해서 결정됩니다.

문자셋내용
UTF-8- 가변 길이 문자 인코딩이며 전 세계 대부분의 문자를 표현할 수 있습니다.
- ASCII 와 호환되며, 라틴 문자는 1byte로, 다국어 문자는 2byte 이상으로 인코딩됩니다.
- 웹개발시 가장 권장되는 문자셋 중 하나입니다.
UTF-16- 16bit 단위로 문자를 표현합니다.
- 라틴 문자는 2byte로, 다국어 문자는 2byte 또는 4byte로 인코딩됩니다.
- 다국어 데이터베이스에서 사용되는 경우가 많습니다.
UTF-32- 32bit 단위로 문자를 표현합니다.
- 모든 문자를 4byte로 인코딩하므로 물리적인 저장 공간 측면에서 비효욜적일 수 있습니다.
EUC-KR- 한국어 문자를 표현할때 사용되는 문자셋입니다.
- 주로 한국에서 사용됩니다.
ISO-8859-1 (Latin-1)- 서유럽 언어를 위한 문자셋이며, 유럽 주요 언어의 문자를 포함합니다.
- ASCII 와 동일하게 1byte로 문자를 나타냅니다.

 
참고로, 웹개발하다 보면 한글이 깨져서 노출되는 경우가 많은데, 대부분의 경우 문자셋이 많지 않아서 생기는 일이 많습니다.
파일 인코딩과 Request, Response 시 인코딩을 동일하게 설정하면 대부분의 한글 관련 깨지는 현상은 해결되곤 합니다.
 
MariaDB에서는 UTF8, UTF8mb3, UTF8mb4 로 문자 인코딩을 설정하기도 하는데, 그럼 이 차이는 뭘까요?
 
1) UTF-8 (utf8)

  • 이전 버전의 Mysql 에서 3byte까지의 문자만 지워하였으며, 4byte로 인코딩 된 문자를 처리할 수 없습니다.

2) UTF-8mb3 (utf8mb3)

  • utf8과 구문적으론 같지만, 명시적으로 3byte 인코딩을 의미합니다.

3) UTF-8mb4 (utf8mb4)

  • 4byte로 인코딩 된 모든 유니코드 문자를 지원합니다.
  • 기본 다국어 평면 이외의 이모지나 일부 특수문자도 처리할 수 있습니다.
  • 국제 표준으로, 대부분의 경우 권장되는 문자셋입니다.

 

문자 정렬(Collaction)

콜레이션(Collaction), 즉 문자 정렬은 데이터를 정렬할 때 문자의 순서를 결정하는 방식을 의미합니다.
문자를 비교하거나 정렬할 때, 어떤 규칙을 따를지를 결정합니다.
 
MariaDB에서는 문자 데이터를 비교하는 데 사용되며, 대소문자 구분 여부, 문자의 가중치, 악센트의 처리 등을 조절할 수 있습니다. 
 
MariaDB에서는 여러 가지 문자 정렬을 제공하는데, 그중 utf8mb4_bin을 특별한 문자 정렬로 주목받고 있습니다.

문자 정렬내용
utf8mb4_bin- 대소문자를 엄격하게 구분합니다.
- 이진(binary) 데이터와 같은 비트 수준의 정확한 비교가 필요한 경우에 사용됩니다.
utf8mb4_general_ci- 대소문자를 구분하지 않습니다.
- 알파벳 이외의 문자들은 일반적인 유니코드 정렬 규칙을 따릅니다.
utf8mb4_unicode_ci- 대소문자를 구분하지 않습니다.
- 유니코드의 정교한 정렬 규칙을 따릅니다.

 
결론적으로 여러 가지 비교를 해보았을 때 MariaDB에서는 문자셋은 utf8mb4, 문자정렬은 utf8mb4_bin 으로 권장되는 듯합니다.
 

데이터베이스 생성 시 설정하기

실제로 데이터베이스 생성시 기본 문자셋을 utf8mb4로 문자정렬은 utf8mb4_bin으로 생성해 보도록 하겠습니다.
아래의 DDL(Data Definition Language) 명령어를 실행하면 됩니다.

CREATE DATABASE `testdb2024` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

 
만약에 이미 생성된 데이터베이스라면, 어떤 문자셋과 문자정렬로 생성된 지 확인해 보도록 하겠습니다.

SHOW CREATE DATABASE testdb2024;

 

SHOW CREATE DATABASE 실행결과

 
SHOW CREATE DATABASE 명령어를 통해 실제 데이터베이스 생성 DDL 명령어를 확인할 수 있습니다.
또는 시스템 데이터베이스 중 information_schema에서 SCHEMATA 데이터를 조회해서도 확인할 수 있습니다.
 

SELECT
    SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'testdb2024';

 

SCHEMATA 조회결과

 

데이터베이스 문자셋 및 문자정렬 변경방법

문자셋만 변경하기

ALTER DATABASE testdb2024 CHARACTER SET utf8mb4;

 
문자정렬만 변경하기

ALTER DATABASE testdb2024 COLLATE utf8mb4_bin;

 
문자셋과 문자정렬 같이 변경하기

ALTER DATABASE testdb2024 CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

 
 

테이블의 문자셋 및 문자정렬 변경방법

테이블을 생성할 때의 문자셋과 문자정렬은 기본적으로 데이터베이스의 기본값으로 생성되도록 되어 있습니다.
데이터베이스의 문자셋과 문자정렬이 utf8mb4, utf8mb4_bin으로 설정이 되어 있다면 테이블도 마찬가지로 같은 설정으로 생성이 됩니다.
 
데이터베이스의 기본값과 달리 문자셋과 문자정렬이 다르게 설정되어 있는 테이블이 있다면 통일시켜줘야 합니다.
 
이미 생성된 테이블의 문자셋과 문자정렬 확인하기

SHOW CREATE TABLE tb_user;

 
테이블의 문자셋과 문자정렬 같이 변경하기

ALTER TABLE tb_user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

 
 

결론

  1. MariaDB에서 데이터베이스나 테이블을 생성할 땐 가급적이면 문자셋은 utfmb8, 문자정렬은 utf8mb4_bin 으로 기본 설정 및 생성하도록 합니다.
  2. 운영 중인 데이터베이스에서 문자셋 및 문자정렬이 다른 테이블이 있는지 확인해 보고, 만약 틀린 게 있다면 성능향상을 위해서 모두 일치하도록 변경해 주는 것이 좋습니다.
  3. 데이터베이스에는 많은 중요한 데이터가 있기에 반드시 테스트환경에서 충분히 테스트 후 운영환경에 반영하여야 합니다.