개요
Collation은 문자열 정렬과 비교 규칙 정의 테이블에 저장되는 바이트 표현은 인코딩(character set)으로 결정되며, 정렬과 비교 결과는 Collation으로 결정됨 둘은 목적과 적용 지점이 다름
핵심 개념
Character set은 문자 ↔ 바이트 매핑 Collation은 특정 문자 집합 위에서 정렬 순서와 동일성 판단 규칙 정의 대소문자 민감도(cs), 대소문자 비민감도(ci), 악센트 민감도(as), 악센트 비민감도(ai) 같은 속성으로 비교 엄격도 제어 언어별 규칙 존재하며 같은 인코딩이라도 Collation에 따라 결과 달라짐
동작 원리와 적용 범위
적용 레벨 계층 구조: 서버 기본값 → 데이터베이스 → 테이블 → 컬럼 → 표현식 단위 오버라이드 가능 영향 받는 연산: ORDER BY, GROUP BY, DISTINCT, LIKE, = 등 문자열 비교 연산 전반 인덱스는 해당 컬럼의 Collation 기준으로 구성되며 정렬 규칙이 범위 검색과 정렬 최적화에 직접 영향 다국어 환경에선 ICU 기반 Collation이나 언어 특화 Collation 선택 필요
주의와 베스트 프랙티스
인코딩과 Collation을 프로젝트 전반에 일관성 있게 설정 정렬과 검색의 기대 동작 정의 후 cs/ci, as/ai를 명시적으로 선택 다국어 문자 처리가 필요하면 유니코드 계열 인코딩 선택 후 언어 중립 또는 목표 언어에 맞는 Collation 매핑 마이그레이션 시 Collation 변경은 테이블 리빌드 및 인덱스 재생성 비용 발생 가능 바이너리 동일성 비교가 필요하면 BINARY 비교 또는 *_bin Collation 사용
간단 예시
같은 인코딩에서 Collation만 다를 때 ‘a’와 ‘B’의 정렬과 비교 결과 달라짐 예시 개념
- 대소문자 비민감도(ci): ‘a’ = ‘A’로 간주, 정렬 시 같이 묶임
- 대소문자 민감도(cs): ‘A’ < ‘a’ 같은 규칙 적용 가능 MySQL 예시 개념
- utf8mb4_0900_ai_ci는 대소문자/악센트 무시
- utf8mb4_0900_as_cs는 악센트 구분 및 대소문자 구분 PostgreSQL 예시 개념
- 데이터베이스 생성 시 LC_COLLATE 지정 또는 CREATE COLLATION으로 사용자 정의 Collation 등록 표현식 단위 오버라이드 예시
- ORDER BY name COLLATE some_collation 형태로 쿼리 레벨에서 지정 가능
정리
Collation은 정렬과 비교 규칙, 인코딩은 저장 형식 정렬과 검색 일관성을 위해 인코딩과 Collation을 분리해서 설계하고, 민감도 옵션을 요구사항에 맞게 선택 필요