CREATE COLLATION - 定义新对照
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
FROMexisting_collation
CREATE COLLATION
使用规定的操作系统语言环境设置定义新对照,或通过复制现有对照来定义新对照。
要创建对照,您必须具有目标模式的 CREATE
权限。
IF NOT EXISTS
如果同名对照已存在,则不要引发错误。在这种情况下,将发出通知。请注意,没有任何保证,即现有对照与本来要创建的对照完全相同。
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
。
lc_collate
如果 provider
是 libc
,则对 LC_COLLATE
语言环境类别使用指定的排序规则。
lc_ctype
如果 provider
是 libc
,则对 LC_CTYPE
语言环境类别使用指定的排序规则。
provider
指定与此排序规则关联的语言环境服务要使用的提供程序。可能的值有 builtin
、icu
(如果服务器使用 ICU 支持构建)或 libc
。 libc
是默认值。详情请参见第 23.1.4 节。
DETERMINISTIC
指定排序规则是否应使用确定性比较。默认值为 true。确定性比较将逐字节不相等的字符串视为不相等,即使从逻辑上讲,这些字符串通过比较是相等的。PostgreSQL 使用逐字节比较进行拆解。非确定性比较可能使排序规则,比如说,区分大小写或重音。为此,您需要选择适当的 LOCALE
设置和在此处将排序规则设置为非确定性。
非确定性排序规则仅受 ICU 提供程序支持。
rules
指定其他排序规则以自定义排序规则的行为。仅受 ICU 支持。详情请参见第 23.2.3.4 节。
version
指定与排序规则一起存储的版本字符串。一般情况下,应忽略此项,这将使版本从操作系统提供的排序规则的实际版本中计算得出。此选项旨在由 pg_upgrade
用来从现有安装中复制版本。
另请参见ALTER COLLATION,了解如何处理排序规则版本不匹配。
现有排序规则
要复制的现有排序规则的名称。新排序规则将具有与现有名称相同的属性,但它将是独立对象。
CREATE COLLATION
在 pg_collation
系统目录中占用 SHARE ROW EXCLUSIVE
锁,该锁自相冲突,因此一次只能运行一个 CREATE COLLATION
命令。
使用 DROP COLLATION
删除用户自定义排序规则。
请参见 第 23.2.2.3 节 了解更多有关如何创建排序规则的信息。
使用 libc
排序规则提供程序时,语言环境必须适用于当前数据库编码。请参见 CREATE DATABASE 了解具体规则。
使用操作系统语言环境 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";
这对于在应用程序中使用与操作系统无关的排序规则名称会较为方便。
CREATE COLLATION
语句在 SQL 标准中,但它仅限于复制现有排序规则。创建新排序规则的语法是 PostgreSQL 扩展。