CREATE COLLATION

定义一个新的排序规则。

概要

CREATE COLLATION [ IF NOT EXISTS ] <name> (
    [ LOCALE = <locale>, ]    
    [ LC_COLLATE = <lc_collate>, ]    
    [ LC_CTYPE = <lc_ctype>, ]
    [ PROVIDER = <provider>, ]
    [ DETERMINISTIC = <boolean>, ]
    [ VERSION = <version> ])

CREATE COLLATION [ IF NOT EXISTS ] <name> FROM <existing_collation>

描述

CREATE COLLATION 命令用于定义新的排序规则,可基于指定的操作系统区域设置创建,或通过复制现有排序规则实现。

创建排序规则时,必须对目标模式拥有 CREATE 权限。

参数

  • IF NOT EXISTS
    • 若已存在同名排序规则,则不应抛出异常。此时将发出通知。请注意,无法保证现有排序规则与本应创建的排序规则具有任何相似性。
  • name
    • 排序规则的名称。排序规则名称可以是带模式限定的。若未指定模式,则该排序规则定义于当前模式中。排序规则名称在该模式内必须唯一。(系统目录中可能包含其他编码下名称相同的排序规则,但若数据库编码不匹配,这些规则将被忽略。)
  • locale
    • 这是同时设置 LC_COLLATE 和 LC_CTYPE 的快捷方式。若指定此选项,则无法单独指定上述任一参数。
  • lc_collate
    • 在 LC_COLLATE 区域设置类别中使用指定的操作系统区域设置。
  • lc_ctype
    • 为 LC_CTYPE 区域设置类别使用指定的操作系统区域设置。
  • provider
    • 指定用于此排序规则相关区域设置服务的提供程序。可能值为:icu、libc。默认值为libc。可用选项取决于操作系统和构建选项。
  • DETERMINISTIC
    • 指定排序规则是否应使用确定性比较。默认值为 true。确定性比较会将字节级不相同的字符串视为不同,即使它们在逻辑比较中被视为相等。数据库通过字节级比较来打破同值情况。非确定性比较可能使排序规则成为不区分大小写或重音的模式。为此,您需要选择适当的LC_COLLATE设置,并在此处将排序规则设为非确定性。
    • 非确定性排序仅在使用icu提供程序时受支持。
  • version
    • 指定与排序规则一同存储的版本字符串。通常应省略此参数,此时系统将根据操作系统提供的排序规则实际版本自动计算版本号。此选项专为 pg_upgrade 设计,用于从现有安装中复制版本信息。
    • 另请参阅ALTER COLLATION以了解如何处理排序规则版本不匹配的情况。
  • existing_collation
    • 要复制的现有排序规则的名称。新排序规则将具有与现有排序规则相同的属性,但它将是一个独立的对象。

注意

CREATE COLLATION 命令会在 pg_collation 系统目录上获取 SHARE ROW EXCLUSIVE 锁(该锁会引发自冲突),因此同一时间仅能执行一条 CREATE COLLATION 命令。

使用 DROP COLLATION 删除用户自定义排序规则。

有关数据库排序规则支持的详细信息,请参阅 PostgreSQL 文档中的 排序规则支持

使用 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');

从现有排序规则创建排序规则:

CREATE COLLATION german FROM "de_DE";

在应用程序中能够使用与操作系统无关的排序规则名称会很方便。

兼容性

SQL标准中存在CREATE COLLATION语句,但其功能仅限于复制现有排序规则。创建新排序规则的语法属于数据库扩展功能。

另见

ALTER COLLATION, DROP COLLATION