티스토리 뷰
[MySQL] 데이터베이스 대소문자 구분을 위한 콜레이션(Collcation), utf8mb4_unicode_ci와 utf8mb4_general_ci 그리고 utf8mb4_bin
망나니개발자 2025. 3. 11. 10:00
1. 데이터베이스 대소문자 구분을 위한 콜레이션(Collcation)
utf8mb4_unicode_ci와 utf8mb4_general_ci 그리고 utf8mb4_bin
[ 데이터베이스 Character Set과 Collcation에 대하여 ]
MySQL 서버는 유니코드 문자 집합을 포함하여 다양한 문자 집합(Character Set)을 지원한다. 대표적으로 다음과 같은 유니코드 문자 집합이 존재한다.
- utf8mb4: 문자당 1~4바이트를 사용하는 유니코드 문자 집합의 UTF-8 인코딩
- utf8mb3: 문자당 1~3바이트를 사용하는 유니코드 문자 집합의 UTF-8 인코딩으로, deprecated 되어 utf8mb4 사용이 권장됨
- utf8: utf8mb3의 alias로 마찬가지로 utf8mb4의 사용을 권장하며, 추후 utf8mb4에 대한 alias가 되도록 변경될 예정임
- 기타 등등
문자 집합은 적어도 하나 이상의 Collation이 존재하는데, 콜레이션(Collation)은 어떻게 문자열을 비교하고 정렬할지 정의한 규칙들의 집합이다. 대부분의 유니코드 문자 집합은 general 콜레이션과 binary 콜레이션 그리고 language-specific한 콜레이션을 지원한다. 콜레이션의 이름은 문자 집합으로 시작하며, 각기 다른 콜레이션의 특성을 나타내는 하나 이상의 접미사들이 뒤에 따라오는 형태이다.
예를 들어 utf8mb4 문자 집합에 대하여 utf8mb4_general_ci, utf8mb4_bin, utf8mb4_danish_ci 등이 존재한다. 대부분의 문자 집합에는 1개의 bin 콜레이션이 존재하지만, utf8mb4는 예외적으로 utf8mb4_bin과 utf8mb4_0900_bin 두 가지가 존재한다. 둘은 정렬 순서는 동일하지만 패드 속성과 콜레이션 가중치 특성으로 구분된다고 볼 수 있다
[ utf8mb4_unicode_ci와 utf8mb4_general_ci 그리고 utf8mb4_bin ]
대표적으로 사용되는 것으로는 utf8mb4_general_ci, utf8mb4_unicode_ci, utf8mb4_bin 인데, 각각의 차이를 살펴보면 다음과 같다.
utf8mb4_general_ci | utf8mb4_unicode_ci | utf8mb4_bin | |
알파벳 대소문자 구분 | X | X | O |
전각/반각 문자 구분 (알파벳, 숫자, 가타가나 등) |
O | X | O |
이모지 구분 | X | X | O |
-- 대소문자 구분 --
SELECT 'a' = 'A' COLLATE utf8mb4_general_ci; -- 결과: 1 (대소문자 구분 X, 같다고 판단)
SELECT 'a' = 'A' COLLATE utf8mb4_unicode_ci; -- 결과: 1 (대소문자 구분 X, 같다고 판단)
SELECT 'a' = 'A' COLLATE utf8mb4_bin; -- 결과: 0 (대소문자 구분 O, 다르다고 판단)
-- 전각/반각 구분 --
SELECT 'A' = 'A' COLLATE utf8mb4_general_ci; -- 결과: 0 (전각/반각 구분 O, 다르다고 판단)
SELECT 'A' = 'A' COLLATE utf8mb4_unicode_ci; -- 결과: 1 (전각/반각 구분 X, 같다고 판단)
SELECT 'A' = 'A' COLLATE utf8mb4_bin; -- 결과: 0 (전각/반각 구분 O, 다르다고 판단)
-- 이모지 구분 --
SELECT '😁' = '😂' COLLATE utf8mb4_general_ci; -- 결과: 1 (이모지 구분 X, 같다고 판단)
SELECT '😁' = '😂' COLLATE utf8mb4_unicode_ci; -- 결과: 1 (이모지 구분 X, 같다고 판단)
SELECT '😁' = '😂' COLLATE utf8mb4_bin; -- 결과: 0 (이모지 구분 O, 다르다고 판단)
모든 유니코드 문자 집합에서 xxx_general_ci 콜레이션을 사용하여 수행하는 작업이 xxx_unicode_ci 콜레이션보다 빠르지만, 정확도는 약간 떨어진다. 왜냐하면 utf8mb4_general_ci는 각 문자를 개별적으로 비교하는 반면, utf8mb4_unicode_ci는 문자 간의 관계(확장, 축약 등)를 고려하여 문자를 비교하기 때문이다. 예를 들어 ß는 독일어 및 일부 다른 언어에서 ss와 같은데, utf8mb4_unicode_ci는 이를 고려하여 비교하는 반면 utf8mb4_general_ci는 이를 단순히 문자 간 일대일 비교를 진행하기 때문이다.
utf8mb4_general_ci와 utf8mb4_unicode_ci는 모두 문자 간의 비교를 진행하며 대소문자를 구분하지 않는 (ci, case-insensitive) 반면에, utf8mb4_bin는 문자가 아닌 바이트 단위의 비교를 진행한다. 따라서 utf8mb4_bin는 대소문자가 구분된다는 점에서 차이가 존재한다.
이모지의 경우에는 utf8mb4_general_ci와 utf8mb4_unicode_ci는 이모지 문자의 길이만 같다면 동일하다고 판단하는 반면, utf8mb4_bin는 역시나 구체적으로 구분하고 있음을 확인할 수 있다.
따라서 문자 간의 완벽한 구분이 필요하다면, utf8mb4_bin을 사용하는 것이 바람직할 것이다. 하지만 상황에 맞게 구분해도 괜찮다면, utf8mb4_general_ci 또는 utf8mb4_unicode_ci 중에서 선택하면 좋을 것이다. 그 외에도 utf8mb4의 다양한 콜레이션이 존재하므로 필요에 맞게 선택해주도록 하자.
참고 자료
- https://dev.mysql.com/doc/refman/8.4/en/charset-mysql.html
- https://dev.mysql.com/doc/refman/8.4/en/charset-unicode.html
- https://dev.mysql.com/doc/refman/8.4/en/charset-unicode-sets.html