排序规则“de-DE-u-kn-true”到底是啥意思

Posted

技术标签:

【中文标题】排序规则“de-DE-u-kn-true”到底是啥意思【英文标题】:What exactly means the collation 'de-DE-u-kn-true'排序规则“de-DE-u-kn-true”到底是什么意思 【发布时间】:2021-12-19 08:42:30 【问题描述】:

为了使用数值对 PostgreSQL 14 varchar 列进行排序,我使用了由

创建的排序规则
CREATE COLLATION de_pos (LOCALE = 'de-DE-u-kn-true', PROVIDER = 'icu');`

使用这样的排序规则 ORDER BY 会产生像这样的正确顺序 1.2.10 1.2.20 1.2.100

如果没有特殊的排序规则 ORDER BY 会导致 1.2.10 1.2.100 1.2.20

我想知道,该排序规则定义的每个部分到底是什么意思?

de-DE => 德语-德国语言环境 u => UTF8 ???? kn => ???? 真 => ????

【问题讨论】:

附带说明:您还可以以不同的方式对版本号进行排序:order by string_to_array(the_column, '.')::int[] 但仅当值是严格的数字时才有效 是的,我知道该函数并进行了测试:它仅适用于两个级别(这意味着对于单个点,1.10、1.20、1.100 等)但我需要一个准递归 string_to_array 由于我的值为 1.2.3.10、1.2.3.20 等。 这也适用于 1.2.3.20 之类的东西 dbfiddle.uk/… 哇,我以为我已经测试过了,太好了……谢谢 【参考方案1】:

请参阅 PostgreSQL 文档中的 ICU Collations。该链接指向 ICU 文档,该文档具有一定的间接性,指向 Unicode Locale Identifier,这清楚地表明 -u 引入了 Unicode 语言环境扩展,而 kn 是这些扩展之一。当您查看Collation Settings 时,您会发现kn 配置了数字排序。 true 是该选项的配置(意思是,数字排序开启):

如果设置为 on,则任何十进制数字序列(General_Category = [UAX44] 中的 Nd) 以其数字在初级级别排序 价值。例如,“A-21”digit 重新排序组的开头。因此与 未定制的 UCA 表,“a$”

这有时被称为“自然排序”。

换句话说,de-DE-u-kn-true 是:

de: 语言德语 DE: 德国地区 u: 下面是 Unicode 语言环境扩展 kn: Unicode 区域设置扩展数字排序 truekn 的值,表示开启数字排序

【讨论】:

感谢您的解释。我已经偶然发现了你提到的 unicode 文档。但是我在整个文档中没有发现任何一次出现的“kn”。这就是我要求的原因。 @Dominik 它在unicode.org/reports/tr35/tr35-collation.html#Collation_Settings的表格中列出 谢谢,我已经创建了一个使用此链接扩展 PostgreSQL 文档的请求。【参考方案2】:

您可以通过指定属性名称来自定义排序规则的排序行为。 在这种情况下,kn-true 代表自然排序顺序或基于数值对数字进行排序的数字排序顺序。

【讨论】:

以上是关于排序规则“de-DE-u-kn-true”到底是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

数据结构里面的“基数排序”到底是啥

德语的最佳 MySQL 排序规则是啥

对于可能以不同语言使用的 PostgreSQL 数据库,正确的排序规则是啥?

SQL Server 与 MySQL 的 unicode_ci 排序规则的类似物是啥?

网上爆火的rpa技术到底是啥?

Latex与Winedit之间到底是啥关系?