[mysql]character set과 collation
이번 포스트에서는 데이터 저장 시 사용되는 character set과 collation에 대해 살펴보자.
character set vs collation
기본 설정
mysql에서는 database 생성 시 character set과 collate를 설정할 수 있다. 생략시에는 mysql 서버의 기본 설정을 따른다.
create database sample
character set utf8 collate utf8mb4_0900_ai_ci;
여기서 character set과 collate의 의미에 대해 살펴보자.
character set
character set은 데이터베이스에 저장할 수 있는 문자들의 집합을 의미한다. 이 문자 집합은 데이터베이스가 어떤 문자들을 인식하고 저장할 수 있는지를 결정하다. 예를들어 지금은 거의 쓰지 않는 EUC-KR 같은 경우 완성형이어서 2,350개의 미리 만들어진 글자만 인식한다. 따라서 '똠', '샾' 같은 글자는 인식할 수 없다. 최근에는 UTF-8, UTF-16, UTF-32가 주로 사용된다.
utf8mb3는 최대 3바이트를 사용해서 문자를 저장하며 일반적인 문자들이 포함된다. utf8mb4는 최대 4바이트를 이용하며 일반적인 문자뿐 아니라 이모티콘, 일부 고대 문자들까지 지원한다.
UTF-8은 ASCII로 작성한 문서나 데이터와의 호환성을 염두에 두고 설계한 인코딩이다. UTF-8은 1~4바이트의 가변길이 인코딩을 사용하며 호환성은 좋지만 상대적으로 인코딩/디코딩 속도가 느릴 수 있다. 반면 UTF-32의 경우는 4바이트의 고정길이이며 호환성을 고려하지 않기 때문에 상대적으로 인코딩/디코딩 속도가 빠를 수 있다.
일반적으로는 UTF-8이 주로 사용되며 UTF-32는 내부처리에 사용된다.
collation
collation은 해당 문자셋을 어떻게 정렬할지를 결정하는 알고리즘을 의미한다. 따라서 order by, like, primary key, unique, 비교 연산자 등 여러 연산에 영향을 줄 수 있다.
mysql에서 utf8mb4의 기본 collation은 utf8mb4_0900_ai_ci인데 상세한 의미는 다음과 같다.
- utf8mb4: character set mapping 정보
- 0900: version 정보로 version-9.0.0 UCA 표준에 따름
- ai: accent insensitive로 악센트를 구분함
- ci: case insensitive로 대소문자를 구분하지 않음
주요 suffix는 다음과 같다.
suffix | 의미 |
_ai, _as | Accent insensitive, Accent sensitive |
_ci, _cs | Case insensitive, Case Sensitive |
_ks | kana sensitive (kana는 일본어 표현에 사용된다) |
_bin | binary |
참조
https://dev.mysql.com/doc/refman/8.4/en/charset-mysql.html
https://dev.mysql.com/doc/refman/8.4/en/charset-unicode-sets.html