23.1. 로케일(Locale) 지원

23.1.1. 개요
23.1.2. 동작
23.1.3. 문제

로케일(Locale) 지원이란 영문자, 정렬, 숫자 형식 등 문화적인 기본 설정과 관련된 지원을 의미한다. PostgreSQL는 서버 운영 체제에서 제공되는 표준 ISO C 및 POSIX 로케일(locale) 기능을 사용한다. 부가적인 정보에 대해서는 시스템 문서를 참조 바란다.

23.1.1. 개요

로케일(locale) 지원은 initdb를 사용하여 데이터베이스 클러스터가 생성되면 자동으로 초기화된다. initdb은 기본적으로 실행 환경의 로케일(locale) 설정을 사용하여 데이터베이스 클러스터를 초기화하므로, 데이터베이스 클러스터에서 시스템이 이미 원하는 로케일(locale)을 사용하는 것으로 설정된 경우 사용자가 특별히 할 일은 없다. 다른 로케일(locale)을 사용하려면(또는 시스템에 어떤 로케일(locale)이 설정되었는지 모를 경우) --locale 옵션으로 initdb 명령을 실행하여 어떤 로케일(locale)이 사용되는지 정확히 알 수 있다. 예를 들면:

initdb --locale=sv_SE

Unix 시스템에 대한 이 예시에서, 스웨덴(SE)에서 사용되는 스웨덴어(sv)가 로케일로 설정된다. 다른 것으로는, en_US(U.S. English) 및 fr_CA (French Canadian)가 있을 수 있다. 로케일(locale)에 두 가지 이상의 문자 세트를 사용하는 경우 language_territory.codeset 규격의 양식을 따를 수 있다. 예를 들면, fr_BE.UTF-8UTF-8 문자 집합 인코딩을 사용하여 벨기에(BE)의 프랑스어(fr)를 나타낸다.

시스템에서 사용할 수 있는 로케일(locale)의 이름은 운영 체제 벤더에 따라, 설치된 것에 따라 다르다. 대부분의 Unix 시스템에서 locale -a 명령은 사용 가능한 로케일(locale) 목록을 보여준다. Windows는 German_Germany 또는 Swedish_Sweden.1252같이 로케일(locale) 이름을 더 자세하게 사용하지만 원리는 동일하다.

경우에 따라 몇 가지 로케일(locale) 규칙을 혼용하는 것이 유용하다. 예를 들면, English 콜레이션 규칙은 사용하되, Spanish 메시지는 사용하지 않을 수 있다. 이것을 지원하기 위해 로컬라이제이션 규칙의 특정 측면만 제어하는 로케일(locale) 보조 카테고리 집합이 존재한다.

LC_COLLATEString 정렬 순서
LC_CTYPE문자 분류(어떤 글자인지, 대문자도 동일한지)
LC_MESSAGES메시지 언어
LC_MONETARY통화 형식
LC_NUMERIC숫자 형식
LC_TIME날짜 및 시간 형식

카테고리 이름은 initdb 옵션 이름으로 번역되어 특정 카테고리의 로케일(locale) 선택을 오버라이드한다. 예를 들면, 로케일(locale)을 Canadian으로 설정하되, 통화 형식은 U.S. 규칙을 사용하려면 initdb --locale=fr_CA --lc-monetary=en_US를 사용해야 한다.

시스템에 로케일(locale) 지원이 안 되는 것처럼 하고 싶으면 특수한 로케일(locale) 이름 C 또는 동등하게 POSIX를 사용해야 한다.

일부 로케일(locale) 카테고리는 데이터베이스가 생성될 때 고정된 값이어야 한다. 서로 다른 데이터베이스에 대해 서로 다른 설정을 사용할 수 있지만 데이터베이스가 생성된 다음에는 해당 데이터베이스에 대한 설정을 변경할 수 없다. LC_COLLATELC_CTYPE이 이러한 카테고리이다. 이것은 인덱스 정렬 순서에 영향을 미치므로 고정된 상태로 유지되어야 하며, 그렇지 않을 경우 텍스트 칼럼의 인덱스가 손상을 입게 된다. (그러나 23.2절에 나오는 콜레이션을 사용하면 이 제한을 완화할 수 있다.) 이 카테고리의 기본값은 initdb가 실행 중에 결정되고 이 값은 CREATE DATABASE 명령에서 지정되지 않았을 경우 새 데이터베이스를 생성할 때 사용된다.

다른 로케일 카테고리는 로케일(locale) 카테고리와 이름이 동일한 서버 환경 설정 매개 변수를 설정함으로써 필요할 때마다 변경 가능하다(자세한 내용은 19.11.2절 참조). initdb에서 선택된 값은 실제로 환경 설정 파일 postgresql.conf에 작성되어 서버 시작 시에 기본값으로 사용된다. 이 할당을 postgresql.conf에서 제거하면 서버가 실행 환경에서 설정을 상속 받는다.

서버의 로케일(locale) 동작은 클라이언트 환경이 아니라 서버에서 표시되는 환경 변수에서 결정된다는 점에 유의해야 한다. 따라서 서버를 시작하기 전에 올바른 로케일(locale) 설정을 환경 설정하는 것에 주의해야 한다. 이것의 결과는, 클라이언트와 서버가 서로 다른 로케일(locale)로 설정된 경우 출처에 따라 메시지가 다른 언어로 나타날 수 있다.

참고

실행 환경에서 로케일(locale) 상속에 대해 언급할 때 이것은 대부분의 운영 체제에서 다음을 의미한다: 콜레이션이라는 지정된 로케일(locale) 카테고리의 경우 설정할 것을 찾을 때까지 이 순서로 LC_ALL, LC_COLLATE(또는 각 카테고리에 해당되는 변수), LANG 환경 변수가 검색된다. 이러한 환경 변수 중 어느 것도 설정되지 않은 경우 로케일(locale) 기본값은 C이다.

메시지 언어 설정을 위해 일부 메시지 로컬라이제이션 라이브러리도 다른 모든 로케일(locale) 설정을 오버라이드하는 환경 변수 LANGUAGE를 살펴본다. 의심스러운 경우 운영 체제 문서, 특히 gettext에 대한 문서를 참조하기 바란다.

사용자가 원하는 언어로 메시지가 번역되게 하려면 빌드 시에 NLS를 선택해야 한다(configure --enable-nls). 다른 모든 로케일(locale) 지원은 자동으로 내장된다.

23.1.2. 동작

로케일(locale) 설정은 다음과 같은 SQL 기능에 영향을 준다.

  • ORDER BY를 사용한 쿼리에서 정렬 순서 또는 텍스트 데이터에서 표준 비교 연산자

  • upperlower, initcap 함수

  • 패턴 일치 연산자(LIKE, SIMILAR TO 및 POSIX 스타일 정규식). 대소문자 비 구분 일치 및 문자 클래스 정규식에 의한 문자 분류에 모두 영향을 미치는 로케일(locale)

  • to_char 계열 함수

  • LIKE 절을 사용한 인덱스 사용 능력

PostgreSQL에서 C 또는 POSIX이 아닌 다른 로케일(locale)을 사용할 때의 단점은 성능이다. 문자 처리가 느려지고 LIKE에서 사용되는 일반 인덱스가 방지된다. 이러한 이유로, 실제로 필요한 경우에만 로케일(locale)을 사용해야 한다.

C가 아닌 로케일(locale) 하에서 LIKE 절을 사용한 인덱스를 PostgreSQL이 이용하게 하려면 몇 가지 커스텀 연산자 클래스가 존재해야 한다. 이것은 로케일(locale) 비교 규칙은 무시하면서 엄격한 문자별 비교를 수행하는 인덱스의 생성을 허용한다. 자세한 내용은 11.10절을 참조 바란다. 다른 방법은 23.2절에 설명된 대로 C 콜레이션을 사용하여 인덱스를 생성하는 것이다.

23.1.3. 문제

위의 설명대로 로케일(locale)이 지원되지 않으면 운영 체제의 로케일(locale) 지원이 바르게 환경 설정되었는지 확인해야 한다. 운영 체제에서 제공되는 경우 로케일(locale)이 시스템에 설치되었는지 확인하기 위해 locale -a 명령을 사용할 수 있다.

사용자가 생각하는 로케일(locale)을 PostgreSQL이 실제로 사용 중인지 확인하라. LC_COLLATELC_CTYPE 설정은 데이터베이스가 생성될 때 결정되고, 새 데이터베이스를 생성할 때 외에는 변경할 수 없다. LC_MESSAGESLC_MONETARY를 비롯한 다른 로케일(locale) 설정은 서버가 시작된 환경에 의해 처음 결정되고, 상황에 따라 바뀔 수 있다. SHOW 명령을 사용하면 활성화된 로케일(locale) 설정을 확인할 수 있다.

소스 배포에서 src/test/locale 디렉터리에는 PostgreSQL의 로케일(locale) 지원에 대한 테스트 세트가 포함되어 있다.

에러 메시지 텍스트를 파싱하여 서버 측 에러를 처리하는 클라이언트 애플리케이션은 서버의 메시지 언어가 다르면 명백하게 문제가 된다. 해당 애플리케이션의 작성자는 에러 코드 스키마를 대신 활용하는 것이 좋다.

메시지 번역 카탈로그를 유지하려면 PostgreSQL이 선호된 언어로 표시되도록 개발하는 자원 봉사자들의 노력이 필요하다. 원하는 언어로 된 메시지가 현재 없거나 번역이 완전하지 않을 수 있기 때문에 사용자들의 개발 협조를 구하고 있다. 도움이 필요하면 54장을 참조하거나 개발자의 메일링 리스트에 기록 바란다.