Postgres UTF8订购

时间:2012-03-01 12:08:30

标签: sql postgresql utf-8 sql-order-by

我在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

这种行为有一个很好的解释吗?以及如何避免它?

2 个答案:

答案 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进行整理。