排序规则“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 区域设置扩展数字排序
true
:kn
的值,表示开启数字排序
【讨论】:
感谢您的解释。我已经偶然发现了你提到的 unicode 文档。但是我在整个文档中没有发现任何一次出现的“kn”。这就是我要求的原因。 @Dominik 它在unicode.org/reports/tr35/tr35-collation.html#Collation_Settings的表格中列出 谢谢,我已经创建了一个使用此链接扩展 PostgreSQL 文档的请求。【参考方案2】:您可以通过指定属性名称来自定义排序规则的排序行为。 在这种情况下,kn-true 代表自然排序顺序或基于数值对数字进行排序的数字排序顺序。
【讨论】:
以上是关于排序规则“de-DE-u-kn-true”到底是啥意思的主要内容,如果未能解决你的问题,请参考以下文章
对于可能以不同语言使用的 PostgreSQL 数据库,正确的排序规则是啥?