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 标准更好的功能。
- 我是否需要从 Postgresql 源代码添加它并编译我自己的 Postgresql 版本以使其可用?
另一个链接问题对 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子句下对多个参数应用排序规则时仍然存在问题(仅考虑第一个参数的排序规则)。
我已经在 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 标准更好的功能。
- 我是否需要从 Postgresql 源代码添加它并编译我自己的 Postgresql 版本以使其可用?
另一个链接问题对 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子句下对多个参数应用排序规则时仍然存在问题(仅考虑第一个参数的排序规则)。