为什么'2'> '10'?

时间:2011-08-13 22:55:17

标签: sql postgresql collation

为什么'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)

2 个答案:

答案 0 :(得分:5)

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

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

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

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


还可以归功于: RhodiumToad和Peerce in #postgresql

答案 1 :(得分:3)

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

根据 PostgreSQL docs: Locale Support

  

语言环境设置会影响以下SQL功能:

     
      
  • 使用文字数据上的ORDER BY对查询中的顺序进行排序
  •   
  • 使用带有LIKE子句的索引的能力
  •   
  • 上,下和initcap函数
  •   
  • to_char函数系列
  •