Postgresql Unicode字符默认排序规则表

Postgresql Unicode字符默认排序规则表,postgresql,unicode,collation,rhel,Postgresql,Unicode,Collation,Rhel,我不知道这个问题到底属于哪个网站,所以把它贴在这里 我在RHEL 6.4上使用Postgresql 9.2,并遵守以下规定: select foo from unnest('{а,ә,б,в,г,д,е,ж}'::text[]) as foo order by foo collate "kk_KZ.utf8" 给予 但是 给予 此外,我发现有一个默认的Unicode排序规则元素表[1],它按适当的顺序列出了有问题的字符(04D9;[.199D.0020.0002.04D9]#西里尔字母SC

我不知道这个问题到底属于哪个网站,所以把它贴在这里

我在RHEL 6.4上使用Postgresql 9.2,并遵守以下规定:

select foo 
from unnest('{а,ә,б,в,г,д,е,ж}'::text[]) as foo 
order by foo collate "kk_KZ.utf8"
给予

但是

给予

此外,我发现有一个默认的Unicode排序规则元素表[1],它按适当的顺序列出了有问题的字符(04D9;[.199D.0020.0002.04D9]#西里尔字母SCHWA)

我理解期望“en_US.utf8”语言环境正确处理西里尔字符是愚蠢的,但在字符通常不属于用于排序的语言/语言环境的情况下,Unicode或任何其他相关标准的正确行为是什么


[1] 这不是放错地方了。这可能是对你的,但不是对我的。:-)很严重,Unicode没有正确的行为;根本不可能。字符集是一种映射;排序规则是一组特定于区域设置的规则,用于对该集中的字符进行排序——即使在同一区域设置内,也可以有多个排序规则

如果你好奇的话,重症监护病房的医生们有很多关于这种东西有多棘手的例子。广泛引用:

[H] 以下是一些不同语言对字符串排序的方式:

字母A-Z可以按与英语不同的顺序排序。例如,在立陶宛语中,“y”在“i”和“k”之间排序

字母组合可以被视为一个字母。例如,在传统西班牙语中,“ch”被视为单个字母,并在“c”和“d”之间排序

重音字母可以被视为非重音字母的次要变体。例如,“é”可以等同于“e”

重音字母可以被视为不同的字母。例如,丹麦语中的“Å”被视为一个单独的字母,在“Z”之后排序

在一种语言中被认为是不同的无重音字母在另一种语言中可能是模糊的。例如,字母“v”和“w”根据英语是两个不同的字母。然而,“v”和“w”在瑞典语中被视为同一字母的变体

一封信可以被视为两封信。例如,在传统德语中,将“ä”比作“ae”

泰语要求某些字母的顺序颠倒

French要求在字符串末尾使用重音符号排序的字母优先于字符串开头的重音符号排序。例如,“côte”一词排在“coté”之前,因为最后一个“e”的重音比“o”的扬抑音更重要

有时小写字母排序在大写字母之前。在其他情况下,则需要反向操作。例如,在英语中,小写字母通常排在大写字母之前。拉脱维亚字母正好相反

即使在同一种语言中,不同的应用程序也可能需要不同的排序顺序。例如,在德语词典中,“of”会出现在“of”之前。在电话簿中,情况正好相反

由于政府法规或Unicode中的新字符/脚本,排序顺序可能会随着时间的推移而改变

允许对DUCET进行任何排气尾孔

没有“正确”的行为。人们可能会有各种各样的行为,最合适的行为取决于上下文和受众。有时,任何行为都可能是正确的,因为在美式英语的校勘中,并没有真正的理由强制任何西里尔字母的排列顺序

为DUCET提供特定于区域设置的裁剪。CLDR使用LDML(语言环境数据标记语言)指定裁剪,语法由

CLDR为en#u US提供的最新版本数据没有定制:它使用a(如UTS#35中“根排序规则”下所述)。它在西里尔字母A之后列出西里尔字母schwa,即您期望的顺序

还有一个en_US_POSIX语言环境的数据,其中包括一些修改,但没有任何更改不是ASCII格式的


系统中安装的en_US语言环境似乎使用了一种剪裁,将schwa放在E旁边,可能是因为它们的形式类似。有人可能会说,对美式英语听众来说,这比把schwa排在A之后更令人惊讶:问问人们那是什么,看看有多少人会告诉你这是一个“颠倒的E”。它不是对的,也不是错的,但是如果你问我,它似乎比CLDR中的排序规则更合适。

Postgresql使用操作系统提供的区域设置。在您的设置中,语言环境由glibc提供。Glibc使用了一个经过大量修改的iso14651的“古老”版本(有关更新Glibc语言环境数据的当前困难的信息,请参阅)

从2018-08-01发布的glibc 2.28开始,glibc将使用ISO 14651:2016中的数据(同步到Unicode 9),并将给出OP预期的en_US订单。

ISO 14651是一种比较字符串和通用模板可定制顺序描述的方法,它与UCA类似,但有一些不同。CTT(通用模板表)是等同于DUCET的ISO14651,它们是对齐的

glibc的排序表中第一次出现
CYRILLIC小写字母SCHWA
,是针对
az_az
地区(阿塞拜疆),它是在
CYRILLIC小写字母IE
之后排序的。这相当于:

commit fcababc4e18fee81940dab20f7c40b1e1fb67209
Author: Ulrich Drepper <drepper@redhat.com>
Date:   Fri Aug 3 08:42:28 2001 +0000

    Update.

    2001-08-03  Ulrich Drepper  <drepper@redhat.com>

        * locale/iso-639.def: Add Tigrinya.
commit 5d2489928c0040d2a71dd0e63c801f2cf98e7efc
Author: Ulrich Drepper <drepper@redhat.com>
Date:   Sun Feb 18 04:34:28 2007 +0000

    [BZ #672]

    2005-01-16  Denis Barbier  <barbier@linuxfr.org>
        [BZ #672]
        * locales/ca_ES: Replace current collation rules by including
        iso14651_t1 and adding extra rules if needed.  There should be
        no noticeable changes in sorted text. only ligatures and
        ignoreable characters have modified weights.
        * locales/da_DK: Likewise.
        * locales/en_CA: Likewise.
        * locales/es_US: Likewise.
        * locales/fi_FI: Likewise.
        * locales/nb_NO: Likewise.

        [BZ #672]
        * locales/iso14651_t1: Simplified.  Extended.
glibc中的大多数地区都从iso14651_t1开始,并对其进行定制,这就是您在
en_US
中看到的


虽然glibc的默认排序是以阿塞拜疆语为基础的,但DUCET的默认排序是以哈萨克语和鞑靼语为基础的,这就是区别所在。

您是否有说明“任何行为都可能是正确的”的参考资料?非常感谢。不。我是基于这样一个事实,英语没有规则来排序西里尔字母(应该是obv)
а
б
в
г
д
е
ә -- misplaced
ж
commit fcababc4e18fee81940dab20f7c40b1e1fb67209
Author: Ulrich Drepper <drepper@redhat.com>
Date:   Fri Aug 3 08:42:28 2001 +0000

    Update.

    2001-08-03  Ulrich Drepper  <drepper@redhat.com>

        * locale/iso-639.def: Add Tigrinya.
commit 5d2489928c0040d2a71dd0e63c801f2cf98e7efc
Author: Ulrich Drepper <drepper@redhat.com>
Date:   Sun Feb 18 04:34:28 2007 +0000

    [BZ #672]

    2005-01-16  Denis Barbier  <barbier@linuxfr.org>
        [BZ #672]
        * locales/ca_ES: Replace current collation rules by including
        iso14651_t1 and adding extra rules if needed.  There should be
        no noticeable changes in sorted text. only ligatures and
        ignoreable characters have modified weights.
        * locales/da_DK: Likewise.
        * locales/en_CA: Likewise.
        * locales/es_US: Likewise.
        * locales/fi_FI: Likewise.
        * locales/nb_NO: Likewise.

        [BZ #672]
        * locales/iso14651_t1: Simplified.  Extended.