Postgresql ORDER_BY ... 整理不同的值 returns 相同的输出
Postgresql ORDER_BY ... COLLATE with different values returns same output
我在本地机器上使用提供的 COLLATE 值进行排序时遇到问题(在服务器上一切正常)。好像没什么效果。
示例 SQL 代码 en_US
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
相同的 SQL 查询 C
COLLATE returns 相同的输出:
a.aa
a.ab
a.ac
aaa
aab
aac
但是在服务器上 returns 不同的 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 库)这些排序规则在不同的操作系统中都是相同的。
我在本地机器上使用提供的 COLLATE 值进行排序时遇到问题(在服务器上一切正常)。好像没什么效果。
示例 SQL 代码 en_US
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
相同的 SQL 查询 C
COLLATE returns 相同的输出:
a.aa
a.ab
a.ac
aaa
aab
aac
但是在服务器上 returns 不同的 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 库)这些排序规则在不同的操作系统中都是相同的。