AWS RDS 和本地计算机上的 PostgreSQL 中的排序规则差异

问题描述 投票:0回答:1

对结果集进行排序时,我在 PostgreSQL 中遇到排序规则问题。我们使用AWS RDS PostgreSQL,并且希望以特定方式对查询结果进行排序。在本地,一切都在我的笔记本电脑(macOS)上完美运行,并且所有测试都通过了。但是,部署到 AWS RDS 上的暂存环境后,排序顺序有所不同。

经过一些研究,我意识到笔记本电脑上的

"en_US.UTF-8"
排序规则的行为与 AWS RDS 实例上的行为不同。

环境详情:

  • 本地:macOS、PostgreSQL 14.7
  • 暂存 (AWS RDS):PostgreSQL 14.12

我认为在这种情况下版本差异应该不重要。

这是我的 macOS 机器上本地的查询和结果

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
    ) 最后出现。

但是,在分阶段(AWS RDS)

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"]

顺序与本地结果不一致:

  • 符号和字母混合在一起。
  • 表情符号不遵循相同的模式。

我尝试/检查过的内容

  1. 我确认这两个环境都使用
    "en_US.UTF-8"
    排序规则。但是,在 AWS RDS 上,排序规则名称显示为
    "en_US.utf8"
    (小写
    .utf8
    )。
  2. PostgreSQL 版本略有不同:本地版本为 14.7,暂存版本为 14.12,但我认为这不会影响排序规则行为。

问题

  • 为什么我的本地 macOS 环境和 AWS RDS 的整理结果不同?
  • 如何使两个环境中的排序顺序保持一致?
postgresql macos amazon-rds collation collate
1个回答
0
投票

排序规则取自系统的 C 库,并且两个系统上似乎使用了不同的 C 库(或不同版本的 C 库)。

如果您想在两个系统上保持一致的排序顺序,我看到两个选项:

  1. 使用二进制排序规则

    "C"
    "POSIX"
    。如果服务器编码相同,那么排序方式应该相同。

    但这可能无法提供您需要的排序顺序。

  2. 使用 ICU 排序规则,如

    "en-US"
    。如果两个系统使用相同版本的 ICU 库,则应该工作相同。

    在 PostgreSQL v15 之前,您可以在列级别使用 ICU 排序规则。从 v15 开始,您还可以定义 ICU 排序规则作为数据库排序规则。

© www.soinside.com 2019 - 2024. All rights reserved.