Mat*_*ieu 5 mysql mariadb operator
我试图在查询中使用感叹号作为非运算符
SELECT !0, !!0, !!!0, !1, !!1, !!!1, !2, !!2, !!!2;
| !0 | !!0 | !!!0 | !1 | !!1 | !!!1 | !2 | !!2 | !!!2 |
|----|-----|------|----|-----|------|----|-----|------|
| 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
Run Code Online (Sandbox Code Playgroud)
结果令人惊讶,但如果我添加括号或空格,它会像我想象的那样工作:
SELECT !0, !(!0), !(!(!0)), !1, !(!1), !(!(!1)), !2, !(!2), !(!(!2));
SELECT !0, ! !0, ! ! !0, !1, ! !1, ! ! !1, !2, ! !2, ! ! !2;
| !0 | !(!0) | !(!(!0)) | !1 | !(!1) | !(!(!1)) | !2 | !(!2) | !(!(!2)) |
|----|-------|----------|----|-------|----------|----|-------|----------|
| 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
Run Code Online (Sandbox Code Playgroud)
EXPLAIN EXTENDED SELECT !0, !!0, !!!0, !1, !!1, !!!1, !2, !!2, !!!2;
SHOW WARNINGS;
Run Code Online (Sandbox Code Playgroud)
执行这两个查询时,我收到以下消息SHOW WARNINGS
:
select (not(0)) AS `!0`,(not(0)) AS `!!0`,(0 <> 0) AS `!!!0`,(not(1)) AS `!1`,(not(1)) AS `!!1`,(1 <> 0) AS `!!!1`,(not(2)) AS `!2`,(not(2)) AS `!!2`,(2 <> 0) AS `!!!2`
Run Code Online (Sandbox Code Playgroud)
谁能解释为什么 mysql(和 mariadb)会出现这样的查询?
这是一个相当严重的缺陷。
http://bugs.mysql.com/bug.php?id=55477
词法分析器,遇到!
认为下一个字符可能是!=
运算符的延续,=
,如果发生这种情况,一切都很好。否则,如果下一个字符属于同一类(可能是逻辑运算符的一部分的字符,例如<
)但与预期不匹配......那么下一个字符只是......消失,显然!
是完整的逻辑运算符本身。
结果是!!
解析为!
当没有用空格分隔时......
!!expr
决心 !(expr)
!!!expr
决心 !(!(expr))
!!!!expr
也决心 !(!(expr))
归档时间: |
|
查看次数: |
1728 次 |
最近记录: |