请看一看:
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 错误提出。
因此,解决方案已在以下步骤中完成:
- 在
- 互联网上搜索并 http://linux.org.ua/任何信息;找到 http://linux.org.ua/cgi-bin/yabb/YaBB.pl?num=1407783417/6#6
- 已出星 错误报告: https://sourceware.org/bugzilla/show_bug.cgi?id=17293, 已修复 2015-05-26
- 已检查
glibc
版本(现在为 2.19( - 抓取了一个补丁;编辑了该补丁(删除了
Makefile
的部分( - 备份
/usr/share/i18n/locales/uk_UA
- 用
[cd /usr/share/i18n/;] patch --dry-run -p2 < locales_uk_UA_softsign.diff
---修补了它,然后没有--dry-run
. -
locale-gen
-
service postgresql restart