使用西里尔字母"ь"进行PostgreSQL排序



请看一看:

WITH toks AS (
  SELECT tok
    FROM
      unnest('{ь, а, чь, ча, чль, чла}'::text[]) AS tok
  ORDER BY tok COLLATE "uk_UA"
)
SELECT ROW_NUMBER() OVER() AS "#", tok FROM toks
ORDER BY tok COLLATE "uk_UA"

PostgreSQL 9.3 (ubuntu( 给了我这个结果:

 # | tok 
---+-----
 1 | а
 2 | ча
 3 | чль
 4 | чла
 5 | чь
 6 | ь
(6 rows)
这里,第 1、2、5 和 6 行正确排序("ь" 在 "а" 之后

(,而第 3 行和第 4 行排序错误("а" 在 "ь" 之后(。

所有字母都是西里尔文,我已经检查了很多次。

请问,出了什么问题以及如何解决方法.(

更新:这是一个最近在主流中修复的错误:https://sourceware.org/bugzilla/show_bug.cgi?id=17293

UPDATE2:请注意下面我自己的回答。

PostgreSQL依赖于操作系统的语言环境进行排序。

看看 Ubuntu 14.04 如何对该列表进行排序:

# locale-gen uk_UA.UTF-8正在生成区域设置...  uk_UA。UTF-8...做生成完成。# 猫>文件ьачьчачльчла# LC_ALL=uk_UA。UTF-8 排序文件ачачльчлачьь

在评论中,您说这是不同的,但我在这里得到的顺序与您的查询完全相同。

事实上,чль先于чла直觉上很奇怪,但我不知道西里尔文。

您可以查看/usr/share/i18n/locales/uk_UA以获取区域设置的定义,并将其作为locales包的 ubuntu 错误提出。

因此,解决方案已在以下步骤中完成:

  1. 互联网上搜索并 http://linux.org.ua/任何信息;找到 http://linux.org.ua/cgi-bin/yabb/YaBB.pl?num=1407783417/6#6
  2. 已出星 错误报告: https://sourceware.org/bugzilla/show_bug.cgi?id=17293, 已修复 2015-05-26
  3. 已检查glibc版本(现在为 2.19(
  4. 抓取了一个补丁;编辑了该补丁(删除了Makefile的部分(
  5. 备份/usr/share/i18n/locales/uk_UA
  6. [cd /usr/share/i18n/;] patch --dry-run -p2 < locales_uk_UA_softsign.diff ---修补了它,然后没有--dry-run.
  7. locale-gen
  8. service postgresql restart

最新更新