问题描述
我在本地计算机上使用提供的COLLATE值进行订购时遇到问题(在服务器上一切正常)。似乎没有任何作用。
SELECT username
FROM "user"
WHERE (
"user"."username" IN (
'aaa','aab','aac','a.aa','a.ab','a.ac')
ORDER BY "user"."username" COLLATE "en_US" ASC;
输出:
a.aa
a.ab
a.ac
aaa
aab
aac
a.aa
a.ab
a.ac
aaa
aab
aac
但是在服务器上,它针对不同的COLLATE返回不同的答案:
en_US
:
aaa
aab
aac
a.aa
a.ab
a.ac
C
:
a.aa
a.ab
a.ac
aaa
aab
aac
本地计算机:OSX,Postgres 9.6
SHOW LC_COLLATE;
lc_collate
-------------
en_US.UTF-8
(1 row)
服务器计算机:Ubuntu,Postgres 9.6
SHOW LC_COLLATE;
lc_collate
------------
en_US.utf8
(1 row)
SHOW LC_COLLATE;
查询输出之间存在差异,因为它们看起来都是有效的(或无效)。
这里有什么问题?
解决方法
默认情况下,PostgreSQL使用操作系统C库的排序规则,因此解释是这些操作系统上的排序规则不同。
为避免该问题,请使用带有ICU支持的PostgreSQL v10或更高版本。然后(只要您使用相同版本的ICU库),这些归类将在不同的操作系统上相同。