↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / 排序规则与编码 / 排序规则提供者标识

builtin

builtin 排序规则提供者。

当前查看 PostgreSQL 18.6。

说明

builtin 排序规则提供者。

提供者
builtin
目录代码
b
范围
源码中的提供者标识;安装或构建中是否可用另行判断

手册定义

从概念上讲,每个支持排序规则的数据类型的表达式都有一个排序规则。(内置的支持排序规则的数据类型包括text、varchar和char。用户定义的基础类型也可以标记为支持排序规则,当然,建立在支持排序规则的数据类型之上的域也支持排序规则。)如果表达式是列引用,则该表达式的排序规则就是该列定义的排序规则。如果表达式是常量,则其排序规则就是该常量数据类型的默认排序规则。更复杂表达式的排序规则则按下文所述,从其输入表达式的排序规则推导出来。

表达式的排序规则可以是“默认”排序规则,这表示为数据库定义的区域设置。表达式的排序规则也可能是不确定的。在这种情况下,排序操作以及其他需要知道排序规则的操作都会失败。

当数据库系统必须执行排序或字符分类时,它会使用输入表达式的排序规则。例如,这会发生在ORDER BY子句以及函数或操作符调用(如 <)中。应用于ORDER BY子句的排序规则就是排序键的排序规则。应用于函数或操作符调用的排序规则则按下文所述,从参数中推导出来。除了比较操作符之外,在大小写之间进行转换的函数(例如lower、upper和 initcap)、模式匹配操作符,以及to_char 及相关函数,也都会考虑排序规则。

对于函数或操作符调用,通过检查参数排序规则推导出的排序规则,会在运行时用于执行指定操作。如果该函数或操作符调用的结果属于支持排序规则的数据类型,那么在解析时它也会被用作该函数或操作符表达式的已定义排序规则,以便在外围表达式需要知道其排序规则时使用。

表达式的排序规则派生可以是显式的,也可以是隐式的。这一区别会影响当一个表达式中出现多个不同排序规则时,系统如何把它们组合起来。使用COLLATE子句时,会发生显式排序规则派生;其他所有排序规则派生都是隐式的。当需要组合多个排序规则时,例如在函数调用中,将使用以下规则:

  1. 如果任一输入表达式具有显式排序规则派生,那么输入表达式中所有显式派生的排序规则都必须相同,否则会报错。如果存在显式派生的排序规则,那么排序规则组合的结果就是该排序规则。

  2. 否则,所有输入表达式都必须具有相同的隐式排序规则派生,或者为默认排序规则。如果存在任何非默认排序规则,那么排序规则组合的结果就是该排序规则;否则,结果就是默认排序规则。

  3. 如果输入表达式之间存在相互冲突的非默认隐式排序规则,则该组合会被视为具有不确定排序规则。除非被调用的特定函数确实需要知道它应当使用哪个排序规则,否则这并不是错误。如果它确实需要,就会在运行时抛出错误。

例如,考虑如下表定义:

CREATE TABLE test1 (
    a text COLLATE "de_DE",
    b text COLLATE "es_ES",
    ...
);

那么在

SELECT a < 'foo' FROM test1;

中,<比较会按de_DE规则进行,因为该表达式组合了一个隐式派生的排序规则和默认排序规则。但在

SELECT a < ('foo' COLLATE "fr_FR") FROM test1;

中,比较会按fr_FR规则进行,因为显式排序规则派生覆盖了隐式派生。进一步,给定

SELECT a < b FROM test1;

解析器无法确定应当应用哪个排序规则,因为a列和b列具有冲突的隐式排序规则。由于 <操作符确实需要知道要使用哪个排序规则,因此这会导致一个错误。该错误可以通过给任一输入表达式附加显式排序规则说明符来解决,例如:

SELECT a < b COLLATE "de_DE" FROM test1;

或者等价地:

SELECT a COLLATE "de_DE" < b FROM test1;

另一方面,结构相似的情况

SELECT a || b FROM test1;

不会导致错误,因为||操作符不关心排序规则:无论使用什么排序规则,其结果都相同。

如果函数或操作符返回的是支持排序规则的数据类型,那么分配给该函数或操作符的输入表达式组合的排序规则,也被认为适用于其结果。因此,在

SELECT * FROM test1 ORDER BY a || 'foo';

中,排序将按de_DE规则进行。但这个查询:

SELECT * FROM test1 ORDER BY a || b;

会报错,因为即使||操作符本身不需要知道排序规则,ORDER BY子句仍然需要。与之前一样,可以通过显式排序规则说明符来解决冲突:

SELECT * FROM test1 ORDER BY a || b COLLATE "fr_FR";

文档与源码

来源构建
版本
18.6
构建
https://ftp.postgresql.org/pub/source/v18.6/postgresql-18.6.tar.bz2
来源指纹
555610c24d53e4316da5b7d3fc25c279d96856d5e0e23ee308c328c5fa881d9f

版本比较

PostgreSQL 17 → 18: 无变化。

比较已记录的接口与属性,排除来源指纹和构建元数据。某个样本中没有记录,不能据此判断实际引入或移除的版本。

相关条目

导出 JSON · 返回排序规则与编码 · 收录范围为 PostgreSQL 17 至 20;最早采样版本不一定是实际引入版本。