【问题标题】:Postgres UTF8 orderingPostgres UTF8 排序
【发布时间】:2012-03-01 12:08:30
【问题描述】:
我在 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。
对这种行为有很好的解释吗?又该如何避免呢?
【问题讨论】:
标签:
sql
postgresql
utf-8
sql-order-by
【解决方案1】:
排序不是基于 Unicode 代码点,而是由排序规则定义的。在 UTF-8 中,我们有 'A'
大多数人(编码人员除外)都期望这种排序。但请随意在需要的地方使用 ASCII 进行核对。
【解决方案2】:
如果您使用的是 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) 是点之前的排序规则和点之后的编码。