PostgreSQL UTF-8二进制排序规则

chx*_*chx 7 postgresql collation utf-8

无论Unicode标准中的字符映射如何,我都希望有一个排序规则,它将0x1234的UTF-8编码命令为0x1235以下.MySQL使用utf8_bin.显然,MSSQL http://msdn.microsoft.com/en-us/library/ms143350.aspx具有BIN和BIN2排序规则.虽然发现这些很容易,但我甚至找不到一个排序列表PostgreSQL支持这个特定问题的答案要少得多.

chx*_*chx 6

C语言环境可以.UTF-8的设计使得字节排序也是代码点排序.这不是微不足道的,但请考虑UTF-8的工作原理:

Number range  Byte 1   Byte 2   Byte 3
0000-007F     0xxxxxxx
0080-07FF     110xxxxx 10xxxxxx
0800-FFFF     1110xxxx 10xxxxxx 10xxxxxx

在对二进制数据(即C语言环境)进行排序时,第一个不相等的字节将确定排序.我们需要看到,如果编码为UTF-8的两个数字不同,则第一个非相等字节对于较低值将较低.如果数字在不同的范围内,那么对于较低的数字,第一个字节确实会更低.在相同的范围内,顺序由与没有编码的字面相同的位确定.

  • @tchrist:这不是问题. (3认同)

Erw*_*ter 5

文本的排序顺序取决于lc_collate(不在系统区域设置!).如果不提供其他语言环境,则系统区域设置仅在创建数据库集群时用作缺省值.

您期望的行为仅适用于区域设置C.在精美的手册中阅读所有相关内容:

C和POSIX排序规则都指定"传统C"行为,其中只有ASCII字母"A"到"Z"被视为字母,并且排序严格按字符代码字节值完成.

强调我的.PostgreSQL 9.1有一些用于整理新功能.可能正是您正在寻找的.