PostgreSQL使用西里尔字母排序ь&引用;

PostgreSQL使用西里尔字母排序ь&引用;,postgresql,sorting,postgresql-9.3,cyrillic,Postgresql,Sorting,Postgresql 9.3,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

请看一看:

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行被错误排序(“а”在“а”之后)

所有的信都是西里尔文,我已经检查过很多次了

拜托,出了什么问题以及如何解决(

更新:这是一个最近在主流中修复的错误:


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 а ча чль чла чь ь #地点gen uk_UA.UTF-8 正在生成区域设置。。。 uk_UA.UTF-8…完成 生成完成。 #cat>文件 ь а чь ча чль чла #LC_ALL=uk_UA.UTF-8排序文件 а ча чль чла чь ь 在评论中,你说这是不同的,但我在这里得到的是与你的查询完全相同的顺序

事实上,
чаа
出现在
ча
之前,直觉上很奇怪,但我不懂西里尔语


您可以查看
/usr/share/i18n/locales/uk_UA
了解区域设置的定义,并将其作为
区域设置
软件包中的ubuntu bug进行介绍。

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

  • 在互联网上搜索任何信息;找到
  • 在错误报告中主演:,已修复2015年5月26日
  • 已选中glibc版本(现在为2.19)
  • 抓取修补程序;编辑修补程序(删除了
    Makefile
    的部分)
  • 备份
    /usr/share/i18n/locales/uk\u UA
    已备份
  • [cd/usr/share/i18n/;]补丁-干运行-p2
    ——然后不使用
    -干运行
  • locale gen
  • 服务postgresql重启

  • 您的数据库的编码是什么?似乎很重要…@TagirValeev编码:UTF8,排序规则:uk_UA.UTF-8(如pgadmin3所示).PostgreSQL使用操作系统中的区域设置顺序。如果您使用具有相同排序规则和相同数据的命令行
    sort
    实用程序,则应输出相同的顺序。@DanielVéritéyes,
    sort
    也会给出一些不同但错误的结果:
    a
    系统的区域设置有问题吗?@DanielVériténo,如果我导出LANG=uk_UA
    --
    排序似乎没问题;默认值
    LANG=uk_UA.UTF-8
    有问题。谢谢你。我会检查所有内容。