用语言环境en_us在posgres中排序很奇怪

时间:2018-07-09 11:12:57

标签: postgresql sorting locale

我正在使用postgres,并且我的数据库具有encoding = UTF8和lc_collat​​e = en_US.UTF-8。当我尝试按列(类型为varchar)选择某些项目顺序时,返回的结果很奇怪。

例如:

SELECT name FROM unnest(ARRAY[
      'abc',  '#abc', 'abc a' , '!abc' , ' abc', '~abc'
]) name ORDER BY name.

postgres返回的排序结果为:

[ "abc", "~abc", " abc", "!abc","#abc", "abc a"]

似乎它没有用字节码排序,奇怪的是那些带有特殊字符的字符串在“ abc”和“ abc a”之间列出。 我想知道在en_US语言环境中排序正确吗?

1 个答案:

答案 0 :(得分:0)

Postgres使用来自操作系统的归类支持,我可以使用安装在CentOS 7上的Postgres 10而不是Windows 10上的Postgres 10来重现您的排序顺序。因此,似乎(至少是CentOS)认为此排序顺序有意义。

但是,您可以使用collate关键字来强制执行特定的排序规则。

SELECT name 
FROM unnest(ARRAY['abc',  '#abc', 'abc a' , '!abc' , ' abc', '~abc']) name 
ORDER BY name collate "C"

返回:

name 
-----
 abc 
!abc 
#abc 
abc  
abc a
~abc 

有关Postgres归类支持的详细信息,请参见in the manual