PostgreSQL 使用西里尔字母“ь”排序

PostgreSQL sorting with Cyrillic "ь"

请看一下:

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
Generating locales...
  uk_UA.UTF-8... done
Generation complete.

# cat >file
ь
а
чь
ча
чль
чла

# LC_ALL=uk_UA.UTF-8 sort file
а
ча
чль
чла
чь
ь

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

确实 чль 出现在 чла 之前,这在直觉上很奇怪,但我不知道西里尔字母。

您可以查看 /usr/share/i18n/locales/uk_UA 以了解语言环境的定义,并将其作为 locales 软件包的 ubuntu 错误提出。

所以,解决方案已经完成了这些步骤:

  1. 上网搜索 http://linux.org.ua/ for any information; found http://linux.org.ua/cgi-bin/yabb/YaBB.pl?num=1407783417/6#6
  2. 已在错误报告中加注星标:https://sourceware.org/bugzilla/show_bug.cgi?id=17293,已于 2015 年 5 月 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