Postgresql Order By非常奇怪

时间:2013-01-07 07:45:19

标签: postgresql

我不熟悉Postgresql。试图学习它,因为我正在将我的Rails应用程序移动到Heroku。

这是订购问题的一个例子。

# select name_kr from users order by name_kr;

 name_kr 
---------
 곽철
 김영
 박영
 안준
 양민
 이남
 임유
 정신
 차욱
 강동수
 강상구
 강신용
 강용석
 강지영
 강지원
 강호석

你可能不懂韩语。但有一个奇怪的事情是它首先显示了2个音节词和3个音节 - 每个都在其组中进行了相应的排序。

以下是相关信息:

kwanak_development=# show lc_collate;
 lc_collate  
-------------
 en_US.UTF-8
(1 row)

kwanak_development=# show lc_ctype;
  lc_ctype   
-------------
 en_US.UTF-8
(1 row)

我做错了什么?

感谢。

萨姆

其他信息:

我尝试按顺序排序并获得了一个有趣的结果。

select name_kr from users order by name_kr collate "ko_KR"; => Same as above
select name_kr from users order by name_kr collate "C"; => Correct Result

2 个答案:

答案 0 :(得分:2)

PostgreSQL排序规则主要由PostgreSQL处理,并且应遵循与UNIX sort命令相同的规则。首先要做的是尝试使用sort命令来确定这实际上是否是问题,或者它是否只是堆栈中某些内容的症状。

如果sort没有使用相同的区域设置显示此问题,那么请向PostgreSQL小组提交一个错误(这对我来说非常不可能,但这是可能的)。如果确实显示了问题,那么您需要与正在使用的标准C库的制造商合作。

作为我们这些不熟悉韩语排序的人的最后一点,您可能想要尝试描述所需的顺序而不仅仅是问题排序。

答案 1 :(得分:1)

在OS X上使用GNU sort 5.93,我在默认语言环境中得到相同的顺序(可能是en_GB.utf8或en_US.utf8中的一个 - 无论如何都不知道韩语)。但是,如果我将LC_ALL设置为ko_KR.utf8,我将首先排序三个字符的字符串。两个和三个字符串的集合在它们之间保持相同的顺序。

请注意,所有三个字符的名称都以“강”开头。这看起来是'강'在天真的语言环境中排除所有其他初始字符后的排序,但在韩语之前排序。如果我插入一个由三个字符的字符串之一组成的无意义字符串,其中初始字符被替换为两个字符字符串之一的初始字符(即“양호석”),那么就用两个字符对其进行排序字符串。这表明排序顺序与字符串的长度无关,而只是与'강'的排序有关。

我完全不知道为什么'강'在我的语言环境中的其他字符之后排序。 '강'位于代码点U + AC15。 '곽'位于代码点U + ACFD。 '차'位于代码点U + CC28。如果排序是在原始代码点上,'강'将在其他字符之前排序,就像对韩文排序一样。

如果我用Java对这些字符串进行排序,它们首先会出现'강'字符串,就像韩语一样。 Java对unicode问题非常谨慎。它与韩国人的同意这一事实让我认为这是正确的顺序。

如果你用UTF-8编码字符,那么它的第一个字节是0xea,它再次在其他字符之前排序,其他字符编码为从0xea到0xec的值开始的字节。这可能是collate "C"为您提供正确结果的原因 - 该设置会导致字符串被排序为不透明字节的字符串,而不是编码字符。

我完全不知道为什么collate "ko_KR"会给出错误的结果。