所以我真的很好奇这是什么原因,或者这是否真的是一个需要提交给MySQL开发团队的错误。
这些查询应该是等效的(它们很难阅读):
SELECT !0, !!0, !!!0, !!!!0, !!!!!0, !!!!!!0;
SELECT NOT 0, NOT NOT 0, NOT NOT NOT 0, NOT NOT NOT NOT 0, NOT NOT NOT NOT NOT 0, NOT NOT NOT NOT NOT NOT 0;
SELECT !(0), !(!(0)), !(!(!(0))), !(!(!(!(0)))), !(!(!(!(!(0))))), !(!(!(!(!(!(0))))));
我希望这些回归:
true, false, true, false, true, false
前两个做,但最后一个回复:
true, true, false, false, true, true
任何人都能解释一下吗?
如果有人好奇,这源于对我提出的问题。因为0被视为false而1被视为true,所以你可以使用一个字段 - 让我们称之为bool_field - 就像这样:
SELECT * FROM something WHERE bool_field
或
SELECT * FROM something WHERE !bool_field
通常情况下,如果我想确保将某些内容视为布尔值(通常不是语言特定的),但又不想反转它的值,我会将其写为:
SELECT * FROM something WHERE !!bool_field
这导致了一个非常奇怪的模式,最后是上面的问题。
MySQL版本是5.5.4
答案 0 :(得分:3)
已经为此提交了一份MySQL错误报告... 6年前!
答案 1 :(得分:0)
MariaDB也可以正常使用
MariaDB [(none)]> SELECT !(0), !(!(0)), !(!(!(0))), !(!(!(!(0)))), !(!(!(!(!(0))))), !(!(!(!(!(!(0))))));
+------+---------+------------+---------------+------------------+---------------------+
| !(0) | !(!(0)) | !(!(!(0))) | !(!(!(!(0)))) | !(!(!(!(!(0))))) | !(!(!(!(!(!(0)))))) |
+------+---------+------------+---------------+------------------+---------------------+
| 1 | 0 | 1 | 0 | 1 | 0 |
+------+---------+------------+---------------+------------------+---------------------+
1 row in set (0.01 sec)
MariaDB [(none)]> SELECT VERSION();
+---------------------+
| VERSION() |
+---------------------+
| 10.1.10-MariaDB-log |
+---------------------+
1 row in set (0.00 sec)
答案 2 :(得分:0)
我与MariaDB Dev Team聊天,他们发给我了这个。
!0 = negate zero = 1.
! !0 = negate (negate 0) = negate 1 = 0,
!!0 = negate negate zero = is/like zero = 1.