【问题标题】:Why is ' 2' > '10'?为什么“2”>“10”?
【发布时间】:2011-10-26 14:21:15
【问题描述】:

为什么'2'初始空间大于'10'?

select ' 2' > '10';
 ?column? 
----------
 t
(1 row)

我尝试了 latin1 和 utf8 英文排序规则:

                                    List of databases
   Name    |   Owner    | Encoding  |    Collation     |      Ctype       |   Access privileges   
-----------+------------+-----------+------------------+------------------+-----------------------
 cpn       | cpn        | UTF8      | en_US.UTF-8      | en_US.UTF-8      | 
 teste     | cpn        | LATIN1    | en_US.ISO-8859-1 | en_US.ISO-8859-1 | 

我知道它与类型有关,因为当它被强制转换时,它会按预期工作:

teste=> select ' 2'::char > '10';
 ?column? 
----------
 f
(1 row)

这里到底发生了什么?

编辑:

以上都是在 Fedora 13 中使用 8.4.8 完成的。但我刚刚在 Centos 6 中使用 9.04 进行了测试,结果相同:

select ' 2' > '10';
 ?column? 
----------
 t
(1 row)

数据库列表

   Name    |   Owner    | Encoding  |  Collation  |    Ctype    |   Access privileges   
-----------+------------+-----------+-------------+-------------+-----------------------
 cpn       | postgres   | UTF8      | en_US.UTF-8 | en_US.UTF-8 | 

新编辑:

这是为了进一步混淆:

select ' ' > '1';
 ?column? 
----------
 f
(1 row)

【问题讨论】:

  • 把空间拿出来有什么不同吗?
  • 你使用的是什么版本的 PostgreSQL?
  • @Jared 如果我把空间拿出来,那么它会按预期工作,即'2'大于'10'
  • 人们,在投票前阅读答案。
  • 这个讨论帖支持all UTF-8 collations ignore spaces。存在其他类似的线程,因此问题似乎是这些排序规则中忽略了空格。

标签: sql postgresql collation


【解决方案1】:

我认为 PostgreSQL 会自动尝试找出幕后的类型,而在 Linux 中它会尝试摆脱 ' ',其中一些比较也是基于语言环境。

  • 因此,' 2' > '10' 变为 '2'>'10',比较结果为 '2'>'1';它们不相等,所以不需要继续字符串的其余部分,并且ascii('2') 大于ascii('1'),因此它的计算结果为真。

  • 如果它是一个相等操作(例如 '22' = '22')它会导致 false,因为 Postgres 会逐字节比较。这很重要,因为引擎在进行比较时使用了两种不同的算法。

  • 如果通过类型转换指定类型,则不会覆盖空格规则 (' '=>'')。


还要感谢: RhodiumToad 和 Peerce 在#postgresql

【讨论】:

    【解决方案2】:

    我认为这与区域设置有关。

    根据PostgreSQL docs: Locale Support

    区域设置会影响以下 SQL 功能:

    • 对文本数据使用 ORDER BY 对查询进行排序
    • 能够将索引与 LIKE 子句一起使用
    • upper、lower 和 initcap 函数
    • to_char 系列函数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 2022-11-19
      • 1970-01-01
      • 2012-02-22
      • 2021-03-15
      • 1970-01-01
      相关资源
      最近更新 更多