Collation

초코칩·2024년 4월 2일

MySQL

목록 보기
6/8
post-thumbnail

Collation

데이터베이스의 collation(정렬)은 문자열 데이터를 정렬하는 방법을 지정하는 설정이다. Collation은 문자열 비교 및 정렬 작업에 사용되며, 데이터베이스에서 문자열 데이터를 저장, 검색 및 정렬할 때 중요한 역할을 한다.

명명 규칙

Collation의 명명 규칙은 일반적으로 다음과 같은 패턴을 따른다.

<문자 집합>_<언어 및 지역>_<추가 옵션>
EX) utf8mb4_0900_ai_ci

문자 집합 (Character Set)

Collation 이름의 첫 부분은 해당 Collation이 적용되는 문자 집합을 나타낸다. 예를 들어, "utf8mb4"는 UTF-8 문자 집합을 나타냅니다.

언어 및 지역 (Language and Locale)

Collation 이름의 두 번째 부분은 Collation이 적용되는 언어와 지역을 나타낸다. 예를 들어, utf8mb4_0900은 유니코드를 기반으로 하며 언어와 지역에 대한 추가 정보를 제공하지 않는다.

추가 옵션 (Additional Options)

일부 Collation 이름은 추가적인 옵션을 포함할 수 있다. 이는 주로 악센트를 구분하거나 대소문자를 구분하는 등의 차이를 나타낸다. 예를 들어, _0900_ai_ci는 악센트를 구분하지 않고 대소문자를 구분하지 않는 Collation임을 나타낸다.

Collation Suffix

Collation suffix에 붙일 수 있는 접미사는 다음과 같다.

Suffix설명
_binBinary Collation (대소문자 구분)
_ciCase-insensitive Collation (대소문자 무시)
_csCase-sensitive Collation (대소문자 구분)
_asAccent-sensitive Collation (악센트 구분)
_aiAccent-insensitive Collation (악센트 무시)
_ksKana-sensitive Collation (가나 구분)

악센트

악센트는 문자에 부가적인 발음 기호를 의미한다. 예를 들어, "é", "á", "ü" 등의 문자에는 악센트가 있다. 악센트는 해당 문자의 발음을 변경하거나 강조하는 데 사용될 수 있다.

한글에서는 악센트를 구분하지 않는다는 의미는 "가"와 "ㄱㅏ"를 다른 문자로 취급하지 않는다는 것이다. 따라서 "가"와 "ㄱㅏ"는 동일한 문자로 취급되며, 이 Collation을 사용하여 정렬하거나 비교할 때 동일하게 처리된다.

-- 데이터 삽입 (2음절)
INSERT INTO ai_table (name) VALUES ('초코'), ('ㅊㅗㅋㅗ'), ('ㅊㅗ코'), ('ㅊㅗ코');
INSERT INTO without_ai_table (name) VALUES ('초코'), ('ㅊㅗㅋㅗ'), ('ㅊㅗ코'), ('ㅊㅗ코');

-- 이름으로 검색 (2음절)
SELECT * FROM ai_table WHERE name = '초코';
SELECT * FROM without_ai_table WHERE name = '초코';

가나

가나는 일본어에서 사용되는 문자(히라가나, 가타가나)로, 각 가나 문자는 특정한 음을 나타낸다. 가나는 일본어의 음성 표기를 위해 사용된다.
가나는 기본적으로 발음과 발음 기호를 나타내며, 가로와 세로의 형태로 나타낸다.

예를 들어 "こんにちは"는 일본어로 "안녕하세요"를 의미한다. 여기서 "こ", "ん", "に", "ち", "は"는 각각 가나 문자다.

MySQL Collation

Default Collation

MySQL 8.0 의 기본 collation 인 utf8mb4_0900_ai_ci는 utf8 이며 글자당 4byte 까지 저장하고, 0900 버전의 UCA 규칙을 따르며 accent, 대소문자, 히라가나와 가타카나, 한글 자음과 결합문자를 구분하지 않는다.

mysql> SHOW COLLATION WHERE Charset = 'utf8mb4';
+----------------------------+---------+-----+---------+----------+---------+---------------+
| Collation                  | Charset | Id  | Default | Compiled | Sortlen | Pad_attribute |
+----------------------------+---------+-----+---------+----------+---------+---------------+
| utf8mb4_0900_ai_ci         | utf8mb4 | 255 | Yes     | Yes      |       0 | NO PAD        |
| utf8mb4_0900_as_ci         | utf8mb4 | 305 |         | Yes      |       0 | NO PAD        |
| utf8mb4_0900_as_cs         | utf8mb4 | 278 |         | Yes      |       0 | NO PAD        |
| utf8mb4_0900_bin           | utf8mb4 | 309 |         | Yes      |       1 | NO PAD        |
| utf8mb4_bin                | utf8mb4 |  46 |         | Yes      |       1 | PAD SPACE     |
...

utf8 vs utf8mb4

utf8과 utf8mb4는 어떤 차이가 있을까?

주요 차이점은 utf8은 이모지와 같은 문자를 지원하지 않는다는 것이다. MySQL에서는 utf8 인코딩은 1~3바이트로 인코딩되는데, 이모지는 utf8로 인코딩을 하려면 4바이트가 필요하기 때문이다. utf8mb4는 4바이트 길이인 utf8mb4로 이모지까지 지원됩니다.

UTF-8 (4 byte)은 mysql의 utf8 (3 byte) 과 다르다.

profile
초코칩처럼 달콤한 코드를 짜자

0개의 댓글