2012-03-01 65 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)是点之前的排序规则和点之后的编码规则。