为什么“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/