【问题标题】:Oracle nls_sort equivalent in postgrespostgres 中的 Oracle nls_sort 等效项
【发布时间】:2020-08-28 10:54:37
【问题描述】:

正在将数据库从 Oracle 迁移到 Postgres。我正在尝试在我的应用程序中实现排序行为,其中以数字开头的字母数字标签需要出现在字母之后(在下面的示例中进行了说明)。

我在 Postgres 中尝试了法语排序规则,但无法达到我在 Oracle 中使用 NLS_SORT "french" 获得的相同结果。

发布 Oracle 查询,我需要 Postgres 中的等效项,可以在 DB 中设置一次,以便应用程序以后使用它。

甲骨文:

ALTER SESSION SET NLS_SORT='FRENCH';
ALTER SESSION SET NLS_COMP=LINGUISTIC;
select LABEL from CARBON order by LABEL ;

 LABEL
    APPLE
    BALL
    102C
    108C
    108D

Postgres:

我尝试从 pg_collation 条目 fr-FR-x-icu 创建名为 french 的排序规则,并使用 pgAdmin GUI 更改现有表列,如下所示:

label character varying(255) COLLATE public.french NOT NULL

不走运,我得到了同样的结果。

select LABEL from CARBON order by LABEL ;

LABEL
102C
108C
108D
APPLE
BALL

我也在 Postgres 中尝试了以下查询,它给出了与上面相同的结果。我在 Postgres 中遗漏了什么吗?

select LABEL from CARBON order by LABEL collate "fr_FR"

【问题讨论】:

    标签: oracle postgresql collation nls-sort nls-comp


    【解决方案1】:

    您可以通过创建对大于拉丁字符的数字进行排序的自定义 ICU 排序规则(从 PostgreSQL v10 开始提供)轻松解决这个问题:

    CREATE COLLATION weird (
       LOCALE = 'fr-u-kr-latn-digit',
       PROVIDER = 'icu'
    );
    
    ALTER TABLE carbon ALTER label TYPE text COLLATE weird;
    
    SELECT * FROM carbon ORDER BY label COLLATE weird;
    
     label 
    -------
     APPLE
     BALL
     102C
     108C
     108D
    (5 rows)
    

    这假设一个最近的 ICU 库,旧版本的语法有些不同。

    对于旧版本的 ICU 库,您可能必须使用

    CREATE COLLATION digitslast (
       PROVIDER = 'icu',
       LOCALE = 'fr@colReorder=latn-digit'
    );
    

    【讨论】:

    • 我无法在 CentOS 7.7 上重现这个 vith PG 12.2:创建了排序规则但顺序没有改变。如果我使用CREATE COLLATION digitslast (provider = icu, locale = 'en@colReorder=latn-digit');,结果相同。为什么?
    • 不知道;我没有可用的 CentOS 7。 ICU库的版本是多少?
    • 我和你的语法都适用于我的带有 libicu 63.2 的 Fedora 系统。
    • 我们之前有这样的说法,即 CentOS(和 Windows)附带的 ICU 库已经过时了。不区分大小写排序规则的解决方案也需要一些调整。 Your answer 是使用不同的 ICU “定义”。也许这里也需要这个
    • 我设法在带有 libicu 63.2 的 CentOS 7.7 上与 PG 12.2 一起使用:需要使用 ./configure --target=Linux --libdir=/lib64 从源代码安装 libicu 63.2(未找到 RPM)并从源代码重建 PG 12.2 PG ./configure 步骤的附加 --with-icu 标志。构建 libicu 所花费的时间几乎与构建 PG 相同。
    猜你喜欢
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多