sql - 具有不同值的 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 库的排序规则,因此解释是这些在这些操作系统上是不同的。
为避免该问题,请使用 PostgreSQL v10 或更高版本,内置 ICU 支持。然后(只要您使用相同版本的 ICU 库)这些排序规则在不同的操作系统中将是相同的。
推荐阅读
- robotframework - 通过 selenium2library 在 Firefox 浏览器中出现“已建立的连接被主机中的软件中止”错误
- javascript - 提交联系表格后如何到达页面上的特定位置?
- laravel - 如何使用 jwt 在 Laravel 中授权用户和管理员?
- c# - EF Core - 使用参考导航属性(外键)保存的模式
- solr - Solr:使用 * 时没有返回结果
- amazon-web-services - 如何在 CloudFormation 的安全组中同时指定 IPv6 和 v4?
- mysql - 如何正确编写 SQL 查询?
- c - 用数组中的数据填充结构
- php - 访问回调函数外的变量递归数组遍历
- node.js - nodejs socket.io 客户端不交换发出的消息