CREATE COLLATION — 새 콜레이션 정의하기
CREATE COLLATION — 새 콜레이션 정의하기
CREATE COLLATION 명령은 지정된 운영체제 로케일 설정을 사용하거나 기존 콜레이션을 복사해 새 콜레이션(collation)을 정의하는 명령이에요. 문자열 비교·정렬의 규칙을 정하는 데 사용해요.
출처: PostgreSQL 문서
본문
Synopsis
CREATE COLLATION [ IF NOT EXISTS ] name (
[ LOCALE = locale, ]
[ LC_COLLATE = lc_collate, ]
[ LC_CTYPE = lc_ctype, ]
[ PROVIDER = provider, ]
[ DETERMINISTIC = boolean, ]
[ RULES = rules, ]
[ VERSION = version ]
)
CREATE COLLATION [ IF NOT EXISTS ] name FROM existing_collation
Description
CREATE COLLATION은 지정된 운영체제 로케일 설정을 사용하거나 기존 콜레이션을 복사해 새 콜레이션을 정의해요.
콜레이션을 생성하려면 대상 스키마에 CREATE 권한이 있어야 해요.
Parameters
IF NOT EXISTS
같은 이름의 콜레이션이 이미 존재하면 오류를 던지지 않아요. 이 경우 공지(notice)가 발행돼요. 참고로 기존 콜레이션이 생성됐을 콜레이션과 어떤 식으로든 같다는 보장은 없어요.
name
콜레이션의 이름이에요. 콜레이션 이름은 스키마 한정일 수 있어요. 그렇지 않으면 현재 스키마에 정의돼요. 콜레이션 이름은 그 스키마 안에서 고유해야 해요. (시스템 카탈로그에는 다른 인코딩에 대한 같은 이름의 콜레이션이 있을 수 있지만, 데이터베이스 인코딩과 일치하지 않으면 무시돼요.)
locale
이 콜레이션에 대한 로케일 이름이에요. 자세한 내용은 23.2.2.3.1 절과 23.2.2.3.2 절을 참고해요.
*provider*가 libc면, 이는 LC_COLLATE와 LC_CTYPE을 한 번에 설정하는 지름길이에요. *locale*을 지정하면 그 두 매개변수를 지정할 수 없어요.
*provider*가 builtin이면 *locale*은 반드시 지정되어야 하고 C, C.UTF-8, 또는 PG_UNICODE_FAST 중 하나여야 해요.
lc_collate
*provider*가 libc면, 지정된 운영체제 로케일을 LC_COLLATE 로케일 범주에 사용해요.
lc_ctype
*provider*가 libc면, 지정된 운영체제 로케일을 LC_CTYPE 로케일 범주에 사용해요.
provider
이 콜레이션과 연결된 로케일 서비스에 사용할 프로바이더를 지정해요. 가능한 값은 builtin, icu (서버가 ICU 지원으로 빌드된 경우), libc예요. 기본값은 libc예요. 자세한 내용은 23.1.4 절을 참고해요.
DETERMINISTIC
콜레이션이 결정적(deterministic) 비교를 사용할지 지정해요. 기본값은 true예요. 결정적 비교는 바이트 단위로 같지 않은 문자열을, 비교가 논리적으로 같다고 간주하더라도 같지 않은 것으로 취급해요. PostgreSQL은 바이트 단위 비교로 동률을 해소해요. 결정적이지 않은 비교는 콜레이션을 예를 들어 대소문자나 악센트에 둔감하게 만들 수 있어요. 그러려면 적절한 LOCALE 설정을 선택하고 그리고 여기서 콜레이션을 결정적이지 않게 설정해야 해요.
비결정적 콜레이션은 ICU 프로바이더에서만 지원돼요.
rules
콜레이션 동작을 사용자 지정하는 추가 콜레이션 규칙을 지정해요. 이 기능은 ICU에서만 지원돼요. 자세한 내용은 23.2.3.4 절을 참고해요.
version
콜레이션과 함께 저장할 버전 문자열을 지정해요. 보통은 생략해야 하며, 생략하면 운영체제가 제공하는 콜레이션의 실제 버전에서 버전이 계산돼요. 이 옵션은 기존 설치에서 버전을 복사하기 위해 pg_upgrade가 사용하도록 만들어진 거예요.
콜레이션 버전 불일치를 처리하는 방법은 ALTER COLLATION도 참고해요.
existing_collation
복사할 기존 콜레이션의 이름이에요. 새 콜레이션은 기존 것과 같은 속성을 갖지만 독립적인 객체예요.
Notes
CREATE COLLATION은 pg_collation 시스템 카탈로그에 자기 자신과 충돌하는 SHARE ROW EXCLUSIVE 잠금을 취하므로, 한 번에 하나의 CREATE COLLATION 명령만 실행될 수 있어요.
사용자 정의 콜레이션을 제거하려면 DROP COLLATION을 사용해요.
콜레이션을 생성하는 방법에 대한 자세한 내용은 23.2.2.3 절을 참고해요.
libc 콜레이션 프로바이더를 사용할 때 로케일은 현재 데이터베이스 인코딩에 적용 가능해야 해요. 정확한 규칙은 CREATE DATABASE를 참고해요.
Examples
운영체제 로케일 fr_FR.utf8에서 콜레이션을 생성하기 (현재 데이터베이스 인코딩이 UTF8이라고 가정):
CREATE COLLATION french (locale = 'fr_FR.utf8');
ICU 프로바이더를 사용해 독일 전화번호부 정렬 순서로 콜레이션을 생성하기:
CREATE COLLATION german_phonebook (provider = icu, locale = 'de-u-co-phonebk');
ICU 프로바이더를 사용하고 루트 ICU 로케일에 기반해, 사용자 지정 규칙으로 콜레이션을 생성하기:
CREATE COLLATION custom (provider = icu, locale = 'und', rules = '&V << w <<< W');
규칙 문법의 추가 세부 사항과 예시는 23.2.3.4 절을 참고해요.
기존 콜레이션에서 콜레이션을 생성하기:
CREATE COLLATION german FROM "de_DE";
이렇게 하면 애플리케이션에서 운영체제에 독립적인 콜레이션 이름을 사용할 수 있어 편리해요.
Compatibility
SQL 표준에는 CREATE COLLATION 문이 있지만, 기존 콜레이션을 복사하는 것으로만 제한돼 있어요. 새 콜레이션을 생성하는 문법은 PostgreSQL 확장이에요.