【问题标题】: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) 是点之前的排序规则和点之后的编码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-25
        • 1970-01-01
        • 1970-01-01
        • 2018-06-11
        相关资源
        最近更新 更多