排序规则(Collation)特性突破了数据库级别静态绑定 LC_COLLATE 的传统限制,允许细粒度地按列乃至按单次 SQL 查询操作显式指定字符串的排序行为与大小写不敏感性。
所有可排序数据类型(如 text、varchar、char)的表达式均具备所属的排序规则。排序规则遵循精确的隐式继承与显式覆盖推导流程:
在查询中通过附加 COLLATE 声明的显式规则具有最高优先级,能够覆盖字段的默认继承规则。若涉及的各操作数之间存在无法自动调和的不匹配排序规则,系统会抛出运行时错误提醒开发者显式消除歧义。
PostgreSQL 支持两大主流底层排序提供程序:
libc:依赖宿主操作系统 C 运行库提供的标准 locale。缺点是当操作系统进行大版本更新或底层 glibc 升级时,部分字形的微小权重调整可能导致既有 B 树索引顺序错乱损坏。
icu:集成国际化组件库(International Components for Unicode,简称 ICU)。ICU 提供了跨全操作系统的绝对稳定一致的 Unicode 排序算法(UCA),支持丰富的本地化细分选项,是现代高可用数据库的首选提供程序。
通过创建非确定性排序规则(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' 将被系统直接判定为唯一键冲突拦截,无需额外依赖函数索引。