微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL ORDER_BY ...使用不同的值进行COLLATE返回相同的输出

如何解决PostgreSQL ORDER_BY ...使用不同的值进行COLLATE返回相同的输出

我在本地计算机上使用提供的COLLATE值进行订购时遇到问题(在服务器上一切正常)。似乎没有任何作用。

带有en_US COLLATE的示例sql代码

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

使用C COLLATE进行的同一SQL查询返回相同的输出

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库),这些归类将在不同的操作系统上相同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。