请看一下:
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 错误提出.
关于PostgreSQL 使用西里尔文排序 "ь",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31135676/