我正在使用postgres,并且我的数据库具有encoding = UTF8和lc_collate = 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语言环境中排序正确吗?
答案 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