我在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
。< / p>
排序规则为en_US.UTF-8
。
这种行为有一个很好的解释吗?以及如何避免它?
答案 0 :(得分:1)
如果您使用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
)的是点前的校对和点后的编码。
答案 1 :(得分:0)
排序不在Unicode代码点上,而是由排序规则定义。在UTF-8中我们有'A'&lt;'a'&lt;'B'&lt;'b'等。
大多数人(编码员除外)都希望这种顺序。但随时可以在需要的地方与ASCII进行整理。