sql - 为什么是 ' 2' > '10' ?

标签 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)

最佳答案

我认为 PostgreSQL 会自动尝试找出幕后的类型,而在 Linux 中它会尝试摆脱 ' ',一些比较也基于区域设置。

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

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

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


同时感谢:#postgresql 中的 RhodiumToad 和 Peerce

关于sql - 为什么是 ' 2' > '10' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7053817/

相关文章:

c# - 4 个表的内部 Join 查询的语法

ajax - Laravel 搜索结果太慢

sql-server-2005 - 这是欧洲+英语语言的最佳排序

java - 在哪里可以找到一组特定的字符串相等性比较规则?

php - 热门评论 sql查询

sql - C语言是否支持SQL语句

sql - 'splain a postgresql EXPLAIN to me

postgresql - 结合多个索引的 Postgres

ruby-on-rails - Rails 是否有将 database.yml 配置转换为数据库 URL 的内置方法?

php - MYSQL:为查询选择了不正确的排序规则