对结果集进行排序时,我在 PostgreSQL 中遇到排序规则问题。我们使用AWS RDS PostgreSQL,并且希望以特定方式对查询结果进行排序。在本地,一切都在我的笔记本电脑(macOS)上完美运行,并且所有测试都通过了。但是,部署到 AWS RDS 上的暂存环境后,排序顺序有所不同。
经过一些研究,我意识到笔记本电脑上的
"en_US.UTF-8"
排序规则的行为与 AWS RDS 实例上的行为不同。
我认为在这种情况下版本差异应该不重要。
SELECT UNNEST(ARRAY['A', '#', 'b', '@', '🕸️spider', '!symbol', 'Try', '💨wind', 'Zzzzzz']) COLLATE "en_US.UTF-8" AS title
ORDER BY title;
["!symbol", "#", "@", "A", "Try", "Zzzzzz", "b", "💨wind", "🕸️spider"]
!
、#
、@
) 首先出现。A
、Try
、Zzzzzz
、b
)。💨wind
, 🕸️spider
) 最后出现。SELECT UNNEST(ARRAY['A', '#', 'b', '@', '🕸️spider', '!symbol', 'Try', '💨wind', 'Zzzzzz']) COLLATE "en_US.utf8" AS title
ORDER BY title;
["@", "#", "A", "b", "🕸️spider", "!symbol", "Try", "💨wind", "Zzzzzz"]
顺序与本地结果不一致:
"en_US.UTF-8"
排序规则。但是,在 AWS RDS 上,排序规则名称显示为 "en_US.utf8"
(小写 .utf8
)。排序规则取自系统的 C 库,并且两个系统上似乎使用了不同的 C 库(或不同版本的 C 库)。
如果您想在两个系统上保持一致的排序顺序,我看到两个选项:
使用二进制排序规则
"C"
或 "POSIX"
。如果服务器编码相同,那么排序方式应该相同。
但这可能无法提供您需要的排序顺序。
使用 ICU 排序规则,如
"en-US"
。如果两个系统使用相同版本的 ICU 库,则应该工作相同。
在 PostgreSQL v15 之前,您可以在列级别使用 ICU 排序规则。从 v15 开始,您还可以定义 ICU 排序规则作为数据库排序规则。