2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不受支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

CREATE COLLATION

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 FROM existing_collation

描述

CREATE COLLATION 使用指定的 operating system locale 设置或通过复制现有排序规则来定义新的排序规则。

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

参数

IF NOT EXISTS

如果已存在具有相同名称的排序规则,则不抛出错误。在这种情况下会发出通知。请注意,无法保证现有排序规则与本应创建的排序规则有任何相似之处。

name

排序规则的名称。排序规则名称可以是模式限定的。如果不是,则排序规则在当前模式中定义。排序规则名称在该模式中必须唯一。(系统目录可以包含对其他编码具有相同名称的排序规则,但如果数据库编码不匹配,则会忽略这些排序规则。)

locale

此排序规则的区域设置名称。有关详细信息,请参阅第 23.2.2.3.1 节第 23.2.2.3.2 节

如果 providerlibc,则这是同时设置 LC_COLLATELC_CTYPE 的快捷方式。如果指定了 locale,则不能指定这两个参数中的任何一个。

如果 providerbuiltin,则必须指定 locale 并将其设置为 CC.UTF-8

lc_collate

如果 providerlibc,则对 LC_COLLATE 区域设置类别使用指定的 operating system locale。

lc_ctype

如果 providerlibc,则对 LC_CTYPE 区域设置类别使用指定的 operating system locale。

provider

指定用于与此排序规则关联的区域设置服务的提供程序。可能的值为 builtinicu(如果服务器使用 ICU 支持构建)或 libclibc 是默认值。有关详细信息,请参阅第 23.1.4 节

DETERMINISTIC

指定排序规则是否应使用确定性比较。默认为 true。确定性比较认为,即使按比较逻辑上相等,也不等于字节级不相等的字符串。PostgreSQL 使用字节级比较来解决平局。非确定性比较可能导致排序规则不区分大小写或不区分重音。为此,您需要选择合适的 LOCALE 设置以及在此处将排序规则设置为非确定性。

非确定性排序规则仅受 ICU 提供程序支持。

rules

指定其他排序规则以自定义排序规则的行为。这仅受 ICU 支持。有关详细信息,请参阅第 23.2.3.4 节

version

指定要与排序规则一起存储的版本字符串。通常,应省略此项,这将导致版本从操作系统提供的排序规则的实际版本计算得出。此选项旨在由 pg_upgrade 用于从现有安装复制版本。

有关如何处理排序规则版本不匹配,请参阅ALTER COLLATION

existing_collation

要复制的现有排序规则的名称。新排序规则将与现有排序规则具有相同的属性,但它将是一个独立的对象。

备注

CREATE COLLATIONpg_collation 系统目录获取自冲突的 SHARE ROW EXCLUSIVE 锁,因此一次只能运行一个 CREATE COLLATION 命令。

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

有关如何创建排序规则的更多信息,请参阅第 23.2.2.3 节

使用 libc 排序规则提供程序时,区域设置必须适用于当前数据库编码。有关精确规则,请参阅CREATE DATABASE

示例

要从 operating system locale 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";

这可以方便地在应用程序中使用与操作系统无关的排序规则名称。

兼容性

SQL 标准中有一个 CREATE COLLATION 语句,但它仅限于复制现有排序规则。创建新排序规则的语法是 PostgreSQL 扩展。

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用此表单报告文档问题。