2012-03-01 67 views
1

我在Postgres中根據varchar字段訂購了少量行的查詢。人們似乎在Postgres的訂貨UTF8字符串錯誤:Postgres UTF8訂購

例如:

「W」在UTF8是87,而「G」是103,但運行SELECT 'W' < 'g';將返回false,同時運行SELECT convert_to('W', 'SQL_ASCII') < convert_to('g', 'SQL_ASCII')';將返回true

排序規則是en_US.UTF-8

對此行爲有很好的解釋嗎?以及如何避免它?

回答

0

排序不在Unicode代碼點上,而是由排序規則定義。在UTF-8中,我們有'A'<'a'<'B'<'b'等

大多數人(除了編碼員)都期望這樣的排序。但隨時可以在需要的地方整理ASCII碼。

1

這將顯示的一些中第一個Unicode碼點的ASCII碼排序規則排序,如果您使用的是utf8編碼:

select s, chr(s) from generate_series(32, 255) s order by chr(s) collate "C"; 

現在同爲pt_BR表示(巴西葡萄牙語)整理:

select s, chr(s) from generate_series(32, 255) s order by chr(s) collate "pt_BR"; 

所謂的排序規則(en_US.UTF-8)是點之前的排序規則和點之後的編碼規則。