Sql 为什么是';2'&燃气轮机';10';?

Sql 为什么是';2'&燃气轮机';10';?,sql,postgresql,collation,Sql,Postgresql,Collation,为什么“2”的初始空格大于“10” select ' 2' > '10'; ?column? ---------- t (1 row) 我尝试了拉丁文1和utf8英文排序规则: List of databases Name | Owner | Encoding | Collation | Ctype | Access privileges -

为什么“2”的初始空格大于“10”

select ' 2' > '10';
 ?column? 
----------
 t
(1 row)
我尝试了拉丁文1和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)

我认为这与区域设置有关

根据

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

  • 对文本数据使用order BY对查询中的顺序进行排序
  • 将索引与LIKE子句一起使用的能力
  • upper、lower和initcap函数
  • to_char函数族

我认为PostgreSQL会自动尝试找出幕后的类型,而在Linux中,它会尝试去掉“”,一些比较也是基于区域设置的

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

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

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



还有一点值得赞扬:postgresql中的RhodiumToad和Peerce

如果你把空间去掉,会有什么不同吗?你使用的是什么版本的postgresql?@Jared如果我把空间去掉,它就会像预期的那样工作,也就是说,“2”比“10”大,在投票前阅读答案。这个讨论线程支持这一点。其他类似的线程也存在,所以问题似乎是在这些排序规则中忽略了空格。