我只是在玩MySQL,想知道为什么下面的语句返回所有行,这意味着WHERE子句总是为真。为了简单起见,我在这里使用公共沙箱: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;
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)的计算结果为true,或者1。然后将1与最左边的1进行比较,结果为真,或者为1。
对于color = true = true
和color = false = false
的示例,如果color
的值为0,则两个表达式都为假。
你的评论:
我认为一切> 0和任何字符串值等于真。
不,如果字符串包含前导数字,则在数字上下文中计算的字符串值可以是数字,但如果没有数字,则默认为0。例如,字符串'123abc'
表示数字123,而字符串'abc'
表示数字0。
在你的例子中,color = 'x' = 'x'
,第一个比较是假的,因为我假设颜色不等于'x'
。在MySQL中,True和false就是整数1和0(这不是标准SQL)。因此,第二次比较是将0与'x'
进行比较,这将'x'
置于数字表达式中,因此它是0。这使得完整表达式0 = 0
为真。