使用Cyrillic"ь"进行PostgreSQL排序

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:请在下面注明我自己的答案.

Dan*_*ité 7

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错误提出.


bro*_*ian 3

因此,解决方案已按以下步骤完成:

  1. 搜索互联网和http://linux.org.ua/以获取任何信息;找到http://linux.org.ua/cgi-bin/yabb/YaBB.pl?num=1407783417/6#6
  2. 错误报告:https://sourceware.org/bugzilla/show_bug.cgi? id=17293,于 2015-05-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,然后用 no修补它--dry-run
  7. locale-gen
  8. service postgresql restart