gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:09:42 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com