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进行介绍。因此,解决方案已在以下步骤中完成:
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
有问题。谢谢你。我会检查所有内容。