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 错误提出。
所以,解决方案已经完成了这些步骤:
- 上网搜索 http://linux.org.ua/ for any information; found http://linux.org.ua/cgi-bin/yabb/YaBB.pl?num=1407783417/6#6
- 已在错误报告中加注星标:https://sourceware.org/bugzilla/show_bug.cgi?id=17293,已于 2015 年 5 月 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
请看一下:
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 错误提出。
所以,解决方案已经完成了这些步骤:
- 上网搜索 http://linux.org.ua/ for any information; found http://linux.org.ua/cgi-bin/yabb/YaBB.pl?num=1407783417/6#6
- 已在错误报告中加注星标:https://sourceware.org/bugzilla/show_bug.cgi?id=17293,已于 2015 年 5 月 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