【问题标题】: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/…
  • 哇,我以为我已经测试过了,太好了……谢谢

标签: sql postgresql collation


【解决方案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”。这就是我要求的原因。
  • 谢谢,我已经创建了一个使用此链接扩展 PostgreSQL 文档的请求。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-26
    • 2017-05-31
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    相关资源
    最近更新 更多