我在Postgres中有一个查询,其中我根据varchar字段对少量的行进行排序。Postgres中的UTF8字符串排序似乎有误:
例如:
在UTF-8中'W‘是87,而'g’是103,但是运行SELECT 'W' < 'g';将返回false,而运行SELECT convert_to('W', 'SQL_ASCII') < convert_to('g', 'SQL_ASCII')';将返回true。
排序规则为en_US.UTF-8。
对这种行为有没有很好的解释?如何避免呢?
发布于 2012-03-01 20:24:46
排序不是基于Unicode代码点的,而是由排序规则定义的。在UTF-8中,我们有'A'<'a'<'B'<'b‘等。
大多数人(除了程序员)都希望有这样的排序。但是你可以在你需要的地方用ASCII来整理。
发布于 2012-03-06 08:44:35
如果您使用的是utf8编码,这将显示一些第一个unicode代码点的ascii排序规则:
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)是点之前的排序规则和点之后的编码。
https://stackoverflow.com/questions/9515943
复制相似问题