Postgresql 12 - 排序规则不起作用 Windows / Linux

Postgresql 12 - Collation not working Windows / Linux

我已经在 Wnindows 和 Linux CentOS 8 上安装了 Postgresql 12。

对于我的项目,我需要创建自己的 ICU 排序规则并将其应用于所有字符列(在列创建中或按请求排序 = 首选)。

在这样做之前,我尝试制作一个简单的测试用例来检查它是否按预期工作......但事实并非如此。

带有一些数字和字母数据的简单 table

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

如果我在 table 列上应用 COLLATE 子句,它也不起作用。

ICU 53 打包到所有 Postgresql 12 安装中,Postgresql 配置中存在 --with-icu 参数。

有人知道如何使这个简单的测试用例有效吗?

https://postgresql.verite.pro/blog/2018/07/25/icu-extension.html.

有一个 ICU 延期提案

另一个链接问题对 Postgresql 10 没有响应: How can I use Postgres collation in Windows OS?

来自 Postgresql 博客的相关帖子

我将我的问题发布到 postgresql 错误 (#16570) 并从 postgresql 维护者那里得到了一些答案。

https://www.postgresql.org/message-id/16570-58cc04e1a6ef3c3f%40postgresql.org

Postgresql Windows 来自 EnterpriseDb 的安装程序附带 ICU 版本 53。 Postgresql Linux Centos 8 安装程序附带 ICU 版本 60。

在 ICU 54 版本之前,排序规则属性的解析由 Postgres 完成。 解析方法没有实现colReorder属性(必须更新Posgtesql文档)

Postgreql 文档明确指出“使用 k* 子标签的示例至少需要 ICU 版本 54。”

CREATE COLLATION digitslast(提供商 = icu,区域设置 = 'en-u-kr-latn-digit'); ===> 对于 ICU >= 54

CREATE COLLATION digitslast(提供商 = icu,区域设置 = '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

在LinuxICU 60版本的Centos 8上,在ORDER BY子句下对多个参数应用排序规则时仍然存在问题(仅考虑第一个参数的排序规则)。