Sql 为什么是';2'&燃气轮机';10';?
为什么“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 -
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')
,因此计算结果为trueascii('1')
- 如果它是一个相等操作(例如'22'='22'),它将导致false,因为Postgres进行逐字节比较。这很重要,因为引擎在进行比较时使用两种不同的算法
- 如果通过类型转换指定类型,则它不会覆盖空格规则(
)'=>'
还有一点值得赞扬:postgresql中的RhodiumToad和Peerce如果你把空间去掉,会有什么不同吗?你使用的是什么版本的postgresql?@Jared如果我把空间去掉,它就会像预期的那样工作,也就是说,“2”比“10”大,在投票前阅读答案。这个讨论线程支持这一点。其他类似的线程也存在,所以问题似乎是在这些排序规则中忽略了空格。