gpt4 book ai didi

Postgresql 12 - 排序规则不适用于 Windows/Linux

转载 作者:行者123 更新时间:2023-12-04 12:34:03 25 4
gpt4 key购买 nike

我已经在 Wnindows 和 Linux CentOS 8 上安装了 Postgresql 12。
对于我的项目,我需要创建自己的 ICU 排序规则并将其应用于所有字符列(按列创建或按请求排序 = 首选)。
在这样做之前,我尝试制作一个简单的测试用例来检查它是否按预期工作……但事实并非如此。
一个包含一些数字和字母数据的简单表格

DROP TABLE IF EXISTS TBL;
CREATE TABLE TBL ( TEXT1 CHARACTER(5), TEXT2 CHARACTER(5) );
INSERT INTO TBL VALUES
('aaaaa', 'aaaaa')
,('aaaaa', '00000')
,('aaaaa', 'bbbbb')
,('aaaaa', '11111')

,('bbbbb', '22222')
,('00000', '22222')
,('ccccc', '22222')
,('11111', '22222');
官方文档中在拉丁字符后对数字进行排序的排序规则
https://www.postgresql.org/docs/12/collation.html
CREATE COLLATION digitslast (provider = icu, locale = 'en-u-kr-latn-digit');
CREATE COLLATION digitslast (provider = icu, locale = 'en@colReorder=latn-digit');
Sort digits after Latin letters. (The default is digits before letters.)
测试要求
1/ SELECT * FROM TBL;
2/ SELECT * FROM TBL ORDER BY TEXT1, TEXT2;
3/ SELECT * FROM TBL ORDER BY TEXT1 COLLATE digitslast;
4/ SELECT * FROM TBL ORDER BY TEXT2 COLLATE digitslast;
5/ SELECT * FROM TBL ORDER BY TEXT1 COLLATE digitslast, TEXT2 COLLATE digitslast;
6/ SELECT * FROM TBL ORDER BY TEXT2 COLLATE digitslast, TEXT1 COLLATE digitslast;
Windows 上的结果 = 整理根本不起作用
1/ OK = TEXT1 + TEXT2 = digits before letters
2/ OK = TEXT1 + TEXT2 = digits before letters
3/ KO = TEXT1 + TEXT2 = digits before letters
4/ KO = TEXT1 + TEXT2 = digits before letters
5/ KO = TEXT1 + TEXT2 = digits before letters
6/ KO = TEXT1 + TEXT2 = digits before letters
Linux Centos 8 上的结果 = 排序规则仅适用于 ORDER BY 的第一列
1/ OK = TEXT1 + TEXT2 = digits before letters
2/ OK = TEXT1 + TEXT2 = digits before letters
3/ OK = TEXT1 = digits after letters + TEXT2 = digits before letters
4/ OK = TEXT1 = digits before letters + TEXT2 = digits after letters
5/ KO = TEXT1 = digits after letters + TEXT2 = digits before letters
6/ KO = TEXT1 = digits before letters + TEXT2 = digits after letters
如果我在表列上应用 COLLATE 子句,它也不起作用。
ICU 53 打包到所有 Postgresql 12 安装中,并且 --with-icu 参数存在于 Postgresql 配置中。
有没有人有任何线索可以使这个简单的测试用例起作用?
来自 https://postgresql.verite.pro/blog/2018/07/25/icu-extension.html 的 ICU 延期提案.
  • 这个扩展添加了一些可能比 Postgresql 标准更好的功能。
  • 我是否需要从 Postgresql 源代码中添加它并编译我自己的 Postgresql 版本以使其可用?

  • 另一个链接问题对 Postgresql 10 没有响应:
    How can I use Postgres collation in Windows OS?
    来自 Postgresql 博客的相关帖子
  • https://www.postgresql.org/message-id/CAE9k0P%3DQRjtS1a0rgTyKag_%2Bs6XCs7vovV%2BgSkUfYVASog0P8w%40mail.gmail.com
  • https://github.com/postgres/postgres/commit/03c396080ddc77b188a11dd54aa2a075ab2718e0
  • 最佳答案

    我将我的问题发布到 postgresql bugs (#16570) 并从 postgresql 维护者那里得到了一些答案。
    https://www.postgresql.org/message-id/16570-58cc04e1a6ef3c3f%40postgresql.org
    EnterpriseDb 的 Postgresql Windows 安装程序带有 ICU 版本 53。
    Postgresql Linux Centos 8 安装程序带有 ICU 版本 60。
    在 ICU 54 版之前,整理属性的解析由 Postgres 完成。
    解析方法没有实现 colReorder 属性(必须更新 Posgtesql 文档)。
    Postgreql 文档明确指出“使用 k* 子标签的示例至少需要 ICU 版本 54”。
    CREATE COLLATION digitallast (provider = icu, locale = 'en-u-kr-latn-digit');
    ===> ICU >= 54
    CREATE COLLATION digitallast (provider = icu, locale = 'en@colReorder=latn-digit');
    ===> 用于 ICU < 54(未实现 colReorder:无法使其正常工作)
    已创建一个新问题来更新 Windows 安装程序上的 ICU 版本(由于技术原因;例如重新索引、版本兼容性等……;将难以使其可用于 Postgresql 版本 13)。
    https://www.postgresql.org/message-id/43f9b6b6-6fae-47bb-8f4d-8e84af354523@manitou-mail.org
    在 ICU 版本 60 的 Linux Centos 8 上,在 ORDER BY 子句下对多个参数应用排序规则时仍然存在问题(仅考虑第一个参数的排序规则)。

    关于Postgresql 12 - 排序规则不适用于 Windows/Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63054543/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com