我正在玩MySQL并且想知道为什么以下语句返回所有行,这意味着WHERE子句始终为true。 为简单起见,我在这里使用公共沙箱: http://headfirstlabs.com/sql_hands_on
SELECT * FROM drink_info where color = '' = '';
SELECT * FROM drink_info where color = '' = 'x';
SELECT * FROM drink_info where color = 'x' = 'x';
SELECT * FROM drink_info where color = 'x' = 'y';
SELECT * FROM drink_info where color = true = false;
SELECT * FROM drink_info where color = false = true;
但是,WHERE子句使用以下值计算为false:
SELECT * FROM drink_info where color = true = true;
SELECT * FROM drink_info where color = false = false;
这会导致错误,因为我期待:
SELECT * FROM drink_info where color = false := false;
答案 0 :(得分:1)
MySQL为相同的运算符从左到右评估表达式。如果它们是不同的运算符当然运算符优先级接管。但是,当使用与示例中相同的运算符时,a + b + c
的评估方式就像您已完成(a + b) + c
一样。
更容易看出你是否使用数字:
mysql> select 1 = 2 = 2;
+-----------+
| 1 = 2 = 2 |
+-----------+
| 0 |
+-----------+
mysql> select 1 = (2 = 2);
+-------------+
| 1 = (2 = 2) |
+-------------+
| 1 |
+-------------+
在第一个示例中,(1 = 2)求值为0,然后将此结果与2进行比较。它们不相等,因此总结果为false,在MySQL中与0相同。
但在第二个例子中,(2 = 2)的计算结果为真,或1.然后将1与最左边的1进行比较,结果为真,或为1.
对于color = true = true
和color = false = false
的示例,如果color
的值为0,则两个表达式都将为false。
重新评论:
我认为一切都是> 0和任何字符串值等于true。
否,如果字符串包含前导数字,则在数字上下文中计算的字符串值可以是数字,但如果没有数字,则默认为0。例如,字符串'123abc'
是数字123,但字符串'abc'
是数字0.
在您的示例color = 'x' = 'x'
中,第一个比较为false,因为我假设颜色不等于'x'
。 MySQL中的真假都是整数1和0(这不是标准SQL)。因此,第二个比较是将0与'x'
进行比较,将'x'
放入数值表达式中,因此它为0.这使得完整表达式0 = 0
为真。