2013-01-07 185 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"給出錯誤的結果。