我不熟悉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
答案 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"
会给出错误的结果。