2013-01-07 138 views
2

我对Postgresql并不熟悉。试图学习它,因为我正在将我的Rails应用程序移动到Heroku。Postgresql排序非常奇怪

下面是排序问题的示例。

# 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

您将需要使用排序规则“知道”如何排序韩国。据我所知,这种行为对en_US来说似乎是正确的。 –

+0

另外,如果您使用PostgreSQL 9.2,请查看“COLLATE”指令。请参阅[整理支持](http://www.postgresql.org/docs/current/interactive/collat​​ion.html)。 –

+0

我试过以下,结果是一样的。从用户中按name_kr选择name_kr COLLATE“ko_KR”; –

回答

2

PostgreSQL的整理主要是由PostgreSQL的处理,应遵循相同的规则UNIX sort命令。首先要做的是尝试使用sort命令来确定这实际上是否是问题,或者它是否仅仅是进一步下降的一个症状。

如果sort在相同的语言环境设置下不显示此问题,那么请向PostgreSQL团队提交错误消息(这种情况非常不可能,但这是可能的)。如果它确实显示了问题,那么您需要将它与您正在使用的标准C库的制作者进行对比。

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

0

在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"给出错误的结果。