PostgreSQL 的“collat​​es”中的“-x-icu”是什么意思?

Tad*_*iak 2 postgresql collation unicode international-components-unicode

我有这个查询:

SELECT * FROM table ORDER BY label ASC;
Run Code Online (Sandbox Code Playgroud)

由于标签不是英文的,它们没有按正确的顺序排序(以“ö”开头的标签不在底部/末尾)。

因此,我尝试:

SELECT * FROM table ORDER BY label COLLATE "sv-SE" ASC;
SELECT * FROM table ORDER BY label COLLATE "sv_SE" ASC;
Run Code Online (Sandbox Code Playgroud)

这些给出了关于那些不存在的排序规则的错误,这让我感到困惑。

经过一番搜索,我想出了这样做:

SELECT * FROM pg_collation;
Run Code Online (Sandbox Code Playgroud)

这表明它应该是:

sv-SE-x-icu
Run Code Online (Sandbox Code Playgroud)

当我使用该标识符时它起作用了,但是“-x-icu”的东西有什么用?那是怎么回事?我讨厌他们总是不得不弄乱标准的语言环境标识符,所以你永远不能只依赖标准的“language_location”格式。

Sol*_*zky 5

文档,23.2。校对支持 / 23.2.2.2.2. ICU 整理,指出:

ICU 提供的排序规则是在 SQL 环境中创建的,名称为 BCP 47 语言标记格式,并附加了“私人使用”扩展名 -x-icu,以将它们与 libc 语言环境区分开来。

 

ICU 是“ Unicode 的国际组件”,根据他们的主页,它是:

ICU 是一套成熟的、广泛使用的 C/C++ 和 Java 库,为软件应用程序提供 Unicode 和全球化支持。ICU 具有广泛的可移植性,可为所有平台以及 C/C++ 和 Java 软件之间的应用程序提供相同的结果。

ICU 在非限制性开源许可下发布,适用于商业软件和其他开源或免费软件。

Unicode 是一种规范,而不是软件,因此多年来每个供应商都自己实现了它,因此几乎没有任何使用排序规则的人会喜欢的一致性。幸运的是,ICU 项目正在被越来越多的供应商实施,这正在改进 Unicode 支持和一致性。如果可用,我希望 ICU 归类是比非 ICU 归类更好的选择。