PostgreSQL 18 中文参考文档(未翻译部分保留英文)🌐 切换到英文原版 →

23.2. 排序规则支持 #

23.2.1. 核心概念与推导机制
23.2.2. 排序规则提供程序(ICU 与 libc)
23.2.3. 非确定性排序规则

排序规则(Collation)特性突破了数据库级别静态绑定 LC_COLLATE 的传统限制,允许细粒度地按列乃至按单次 SQL 查询操作显式指定字符串的排序行为与大小写不敏感性。

23.2.1. 核心概念与推导机制 #

所有可排序数据类型(如 text、varchar、char)的表达式均具备所属的排序规则。排序规则遵循精确的隐式继承与显式覆盖推导流程: 在查询中通过附加 COLLATE 声明的显式规则具有最高优先级,能够覆盖字段的默认继承规则。若涉及的各操作数之间存在无法自动调和的不匹配排序规则,系统会抛出运行时错误提醒开发者显式消除歧义。

23.2.2. 排序规则提供程序(ICU 与 libc) #

PostgreSQL 支持两大主流底层排序提供程序:

  • libc:依赖宿主操作系统 C 运行库提供的标准 locale。缺点是当操作系统进行大版本更新或底层 glibc 升级时,部分字形的微小权重调整可能导致既有 B 树索引顺序错乱损坏。

  • icu:集成国际化组件库(International Components for Unicode,简称 ICU)。ICU 提供了跨全操作系统的绝对稳定一致的 Unicode 排序算法(UCA),支持丰富的本地化细分选项,是现代高可用数据库的首选提供程序。

23.2.3. 非确定性排序规则 #

通过创建非确定性排序规则(Nondeterministic Collation),能够实现天然大小写不敏感(Case-Insensitive,如自动视 'a' 与 'A' 等价)或重音不敏感(Accent-Insensitive,自动视重音字符与普通字符等价)的数据表物理存储与唯一索引约束:

CREATE COLLATION case_insensitive (provider = icu, locale = 'und-u-ks-level2', deterministic = false);
CREATE TABLE users (name text COLLATE case_insensitive UNIQUE);

在该唯一索引下,插入小写 'john' 之后,再次插入大写 'JOHN' 将被系统直接判定为唯一键冲突拦截,无需额外依赖函数索引。