排序规则
排序规则特性允许指定每一列甚至每一个操作的数据的排序顺序和字符分类行为。这放松了数据库的LC_COLLATE
和LC_CTYPE
设置自创建以后就不能更改这一限制。
在概念上,一种可排序数据类型的每一种表达式都有一个排序规则(内建的可排序数据类型是text
、varchar
和char
。用户定义的基础类型也可以被标记为可排序的,并且在一种可排序数据类型上的域也是可排序的)。如果该表达式是一个列引用,该表达式的排序规则就是列所定义的排序规则。如果该表达式是一个常量,排序规则就是该常量数据类型的默认排序规则。更复杂表达式的排序规则根据其输入的排序规则得来,如下所述:
一个表达式的排序规则可以是“默认”排序规则,它表示数据库的区域设置。一个表达式的排序规则也可能是不确定的。在这种情况下,排序操作和其他需要知道排序规则的操作会失败。
当数据库系统必须要执行一次排序或者字符分类时,它使用输入表达式的排序规则。这会在使用例如ORDER BY
子句以及函数或操作符调用(如<
)时发生。应用于ORDER BY
子句的排序规则就是排序键的排序规则。应用于函数或操作符调用的排序规则从它们的参数得来,具体如下文所述。除比较操作符之外,在大小写字母之间转换的函数会考虑排序规则,例如lower
、upper
和initcap
。模式匹配操作符和to_char
及相关函数也会考虑排序规则。
对于一个函数或操作符调用,其排序规则通过检查在执行指定操作时参数的排序规则来获得。如果该函数或操作符调用的结果是一种可排序的数据类型,万一有外围表达式要求函数或操作符表达式的排序规则,在解析时结果的排序规则也会被用作函数或操作符表达式的排序规则。
一个表达式的排序规则派生可以是显式或隐式。该区别会影响多个不同的排序规则出现在同一个表达式中时如何组合它们。当使用一个COLLATE
子句时,将发生显式排序规则派生。所有其他排序规则派生都是隐式的。当多个排序规则需要被组合时(例如在一个函数调用中),将使用下面的规则:
- 如果任何一个输入表达式具有一个显式排序规则派生,则在输入表达式之间的所有显式派生的排序规则必须相同,否则将产生一个错误。如果任何一个显式派生的排序规则存在,它就是排序规则组合的结果。
- 否则,所有输入表达式必须具有相同的隐式排序规则派生或默认排序规则。如果任何一个非默认排序规则存在,它就是排序规则组合的结果。否则,结果是默认排序规则。
- 如果在输入表达式之间存在冲突的非默认隐式排序规则,则组合被认为是具有不确定排序规则。这并非一种错误情况,除非被调用的特定函数要求提供排序规则的知识。如果它确实这样做,运行时将发生一个错误。
下表显示了 PostgreSQL 中可用的排序规则。
规则名 | 提供者 | 描述 |
---|---|---|
default | libc | 在数据库创建时指定的LC_COLLATE 和LC_CTYPE 值 |
C | libc | 按 “传统的 C” 的行为进行排序的规则,在其中只有 ASCII 字母A 到Z 被视为字母,并且排序严格地按照字符编码的字节值完成。 |
POSIX | libc | 按 “传统的 C” 的行为进行排序的规则。 |
ucs_basic | libc | SQL 标准排序规则,可用于编码UTF8 。它相当于C ,并按 Unicode 编码排序。 |
zh_CN | libc | 中文(简体,中国) |
zh_CN.utf8 | libc | 中文(简体,中国),可用于编码UTF8 。 |
zh_CN.gb2312 | libc | 中文(简体,中国),可用于编码GB2312 。 |
zh_HK | libc | 中文(简体,中国香港特别行政区) |
zh_HK.utf8 | libc | 中文(简体,中国香港特别行政区),可用于编码UTF8 。 |
zh_TW | libc | 中文(繁体,台湾) |
zh_TW.utf8 | libc | 中文(繁体,台湾),可用于编码UTF8 。 |
zh_TW.euctw | libc | 中文(繁体,台湾),可用于编码EUCTW 。 |
zh_SG | libc | 中文(简体,新加坡) |
zh_SG.utf8 | libc | 中文(简体,新加坡),可用于编码UTF8 。 |
zh_SG.gb2312 | libc | 中文(简体,新加坡),可用于编码GB2312 。 |
zh-x-icu | ICU | 中文。按中文拼音排序 |
zh-Hans-x-icu | ICU | 中文(简体)。按中文拼音排序 |
zh-Hans-CN-x-icu | ICU | 中文(简体,中国)。按中文拼音排序 |
zh-Hans-HK-x-icu | ICU | 中文(简体,中国香港特别行政区)。按中文拼音排序 |
zh-Hans-MO-x-icu | ICU | 中文(简体,中国澳门特别行政区)。按中文拼音排序 |
zh-Hans-SG-x-icu | ICU | 中文(简体,新加坡)。按中文拼音排序 |
zh-Hant-x-icu | ICU | 中文(繁体)。按中文部首/笔顺排序 |
zh-Hant-HK-x-icu | ICU | 中文(繁体,中国香港特别行政区)。按中文部首/笔顺排序 |
zh-Hant-MO-x-icu | ICU | 中文(繁体,中国澳门特别行政区)。按中文部首/笔顺排序 |
zh-Hant-TW-x-icu | ICU | 中文(繁体,台湾)。按中文部首/笔顺排序 |