Mysql Bug?反转0不一致

时间:2016-04-12 18:00:39

标签: mysql

所以我真的很好奇这是什么原因,或者这是否真的是一个需要提交给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

3 个答案:

答案 0 :(得分:3)

已经为此提交了一份MySQL错误报告... 6年前!

http://bugs.mysql.com/bug.php?id=55477

答案 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.