PostgreSQL: Locale
※ PostgreSQL: Locale.
안녕하세요. 듀스트림입니다.
오늘 포스팅은 읽어두시면 언젠가 한번은 써먹으실 로케일에 관련된 내용입니다.
1. 로케일(Locale)의 개념과 PostgreSQL의 사용 목적
로케일(Locale)은 운영체제와 애플리케이션이 문자 정렬(COLLATE), 문자 분류(CTYPE), 메시지 언어 등을 어떻게 처리할지를 정의하는 설정입니다.
PostgreSQL에서는 로케일 설정이 아래 기능에 영향을 줍니다.
| 항목 | 설명 |
| LC_COLLATE | 문자열 정렬 기준 |
| LC_CTYPE | 대소문자 구분, 유효한 문자 분류 |
| LC_MESSAGES | PostgreSQL 오류 메시지의 언어 |
| LC_NUMERIC, LC_MONETARY 등 | 숫자, 통화, 날짜 등의 표현 방식 |
위 설정은 initdb 시점에 결정되며 이후에는 변경할 수 없습니다. 따라서 초기화 시 올바른 로케일을 선택하는 것이 중요합니다.
23.1. Locale Support
23.1. Locale Support # 23.1.1. Overview 23.1.2. Behavior 23.1.3. Selecting Locales 23.1.4. Locale Providers 23.1.5. ICU Locales 23.1.6. Problems Locale support …
www.postgresql.org
2. initdb에서 로케일이 적용되는 방식
2.1 기본 동작
initdb는 기본적으로 환경 변수 LANG 또는 LC_ALL의 값을 읽어 로케일을 결정합니다. 이를 덮어쓰고 싶을 경우 아래와 같은 옵션을 명시합니다.
| 옵션 | 설명 |
| --locale=<locale> | 전체 로케일을 일괄 지정 (LC_ALL 역할) |
| --lc-collate, --lc-ctype, ... | 개별 로케일 항목을 구체적으로 지정 |
| --encoding=UTF8 | 문자 인코딩 설정 |
# 예시
initdb --pgdata=/data/pgdata \
--locale=ko_KR.utf8 \
--encoding=UTF8
initdb
initdb initdb — create a new PostgreSQL database cluster Synopsis initdb [option...] [ --pgdata | -D ] directory Description initdb …
www.postgresql.org
2.2 PostgreSQL 15 버전부터의 변화 - ICU 지원
PostgreSQL 15부터는 기존의 glibc 기반 로케일(libc) 외에 ICU(International Components for Unicode) 기반 로케일을 공식 지원합니다.
ICU는 glibc보다 정렬 정확도가 높고, 다양한 언어/문화권 특성을 더 잘 반영합니다.
| 옵션 | 설명 |
| --locale-provider=icu | ICU를 로케일 제공자로 지정 |
| --icu-locale=<locale> | ICU 스타일 로케일 ID 지정 (ko-KR, de, en-US-u-kn-true 등) |
# 예시
initdb --pgdata=/data/pgdata \
--locale-provider=icu \
--icu-locale=ko-KR \
--locale=ko_KR.utf8 \
--encoding=UTF8
• 정렬 및 문자 처리를 ICU 로케일(ko-KR)로 수행
• 시스템 메시지 및 기본 fallback 동작은 glibc 로케일(ko_KR.utf8)로 설정
23.2. Collation Support
23.2. Collation Support # 23.2.1. Concepts 23.2.2. Managing Collations 23.2.3. ICU Custom Collations The collation feature allows specifying the sort order …
www.postgresql.org
3. 로케일 확인 방법
로케일 설정은 postgresql.conf에 기록되지 않으며, 시스템 카탈로그(pg_database, pg_collation)에 저장됩니다.
▸ 현재 DB의 로케일 확인
SELECT datname, datcollate, datctype
FROM pg_database
WHERE datname = current_database();

▸ Default collation의 provider 확인
SELECT collname, collprovider
FROM pg_collation
WHERE collname = 'default';

| collprovider 값 | 의미 |
| c | glibc (libc) |
| i | ICU |
| d | PostgreSQL 17부터 추가된 built-in 고정 정렬 |
4. initdb에서 로케일이 적용되지 않는 경우
| 원인 | 설명 |
| ICU 없이 PostgreSQL 빌드 | --with-icu 없이 빌드 시 --locale-provider=icu는 무시됨 |
| 시스템에 로케일이 없음 | --locale=de_DE.UTF-8 등 glibc 로케일이 없으면 에러 발생 |
| localedef 필요 | 로케일이 시스템에 없으면 sudo localedef -i <LOCALE> -f UTF-8 <LOCALE>.UTF-8으로 생성 필요 |
5. 시스템 패키지 요구사항
ICU 로케일 또는 glibc 로케일을 사용하려면 아래 패키지가 필요합니다.
| 패키지 | 설명 |
| libicu | ICU 런타임 라이브러리 |
| libicu-devel | ICU 개발 헤더 및 링크용 라이브러리 |
| glibc-all-langpacks | 모든 glibc 로케일 포함 |
| glibc-locale-source | 수동 localedef 사용 시 필요 |
6. 요약
| 항목 | PostgreSQL 14 이하 | PostgreSQL 15 이상 | PostgreSQL 17 |
| 로케일 종류 | glibc만 사용 | glibc + ICU | glibc + ICU + built-in |
| ICU 정렬 | ❌ 지원 안됨 | ✅ --locale-provider=icu | ✅ 기본 내장 정렬도 가능 |
| 적용 방법 | --locale 또는 환경변수 | --locale, --icu-locale, --locale-provider | 동일 + built-in 사용 가능 |
| 확인 방법 | pg_database, pg_collation 조회 | 동일 | 동일 |
오늘은 여기까지~