MySQL比较优先级/重言式



我只是在玩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 = truecolor = 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为真。

最新更新