首页 > 解决方案 > 具有不同值的 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;,它们似乎都有效(或无效?)。

这里可能有什么问题?

标签: sqlpostgresqlcollate

解决方案


PostgreSQL 默认使用操作系统的 C 库的排序规则,因此解释是这些在这些操作系统上是不同的。

为避免该问题,请使用 PostgreSQL v10 或更高版本,内置 ICU 支持。然后(只要您使用相同版本的 ICU 库)这些排序规则在不同的操作系统中将是相同的。


推荐阅读