PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

52.12. pg_collation #

目录 pg_collation 描述可用的排序规则, 它们本质上是从 SQL 名称到操作系统区域设置类别的映射。 更多信息见 Section 23.2。

Table 52.12. \1 字段列说明

Column Type

Description

oid oid

Row identifier

collname name

排序规则名称(在每个命名空间和编码内唯一)

collnamespace oid (references pg_namespace.oid)

包含此排序规则的命名空间的 OID

collowner oid (references pg_authid.oid)

排序规则的拥有者

collprovider char

排序规则的提供者:d = 数据库默认,b = 内建,c = libc,i = icu

collisdeterministic bool

排序规则是否是确定性的?

collencoding int4

该排序规则适用的编码,如果它对任何编码都适用则为 -1

collcollate text

此排序规则对象的 LC_COLLATE。如果提供者不是 libc,则 collcollate 为 NULL,改用 colllocale。

collctype text

此排序规则对象的 LC_CTYPE。如果提供者不是 libc,则 collctype 为 NULL,改用 colllocale。

colllocale text

此排序规则对象提供者相关的区域设置名称。如果提供者是 libc,则 colllocale 为 NULL; 此时会改用 collcollate 和 collctype。

collicurules text

此排序规则对象的 ICU 排序规则

collversion text

排序规则提供者侧的版本。它在排序规则被创建时记录, 并在使用时检查,以检测可能导致数据损坏的排序规则定义变更。


注意,此目录上的唯一键是 (collname, collencoding, collnamespace), 而不只是(collname, collnamespace)。 PostgreSQL 通常会忽略所有 collencoding 不等于当前数据库编码 或 -1 的排序规则,并且禁止创建与 collencoding = -1 的条目同名的新条目。 因此,使用限定的 SQL 名称 (schema.name) 来标识一个排序规则就足够了,即使按目录定义这并不唯一。 这样定义目录的原因在于,initdb 会在集群初始化时用系统上所有可用区域设置的条目来填充它, 因此它必须能容纳集群中可能用到的所有编码的条目。

在 template0 数据库中,创建编码与数据库编码 不匹配的排序规则可能有用, 因为它们可以匹配之后从 template0 克隆出来的 数据库的编码。目前这必须手工完成。