bro*_*ian 12 sorting postgresql cyrillic postgresql-9.3
请看一下,请:
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"
Run Code Online (Sandbox Code Playgroud)
PostgreSQL 9.3(ubuntu)给了我这个结果:
# | tok
---+-----
1 | ?
2 | ??
3 | ???
4 | ???
5 | ??
6 | ?
(6 rows)
Run Code Online (Sandbox Code Playgroud)
在这里,行1,2,5和6被正确排序("ь"在"а"之后),而行3和4被错误地排序("а"在"ь"之后).
所有的字母都是西里尔字母,我已经检查了很多次.
请问,有什么问题,以及如何解决.(
更新:这是最近在主流中修复的错误:https://sourceware.org/bugzilla/show_bug.cgi?id = 17293
更新2:请在下面注明我自己的答案.
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错误提出.
因此,解决方案已按以下步骤完成:
glibc版本(现在是2.19)Makefile)/usr/share/i18n/locales/uk_UA[cd /usr/share/i18n/;] patch --dry-run -p2 < locales_uk_UA_softsign.diff,然后用 no修补它--dry-run。locale-genservice postgresql restart