我有一个案例,表达式不是计算,也不是字段。 不知何故,这是有效的SQL,并且这种系统的结果具有不同的排列,会产生不同的结果。
我试图找出MySQL的作用,但我无法弄清楚任何模式,也没有任何意义。
以下是查询示例:
SELECT
*
FROM
<table>
WHERE
status = 'test'
BETWEEN
2 AND
'test';
随意替换值和数据类型。
我很欣赏这里可能发生的事情的暗示。
答案 0 :(得分:1)
status = 'test'
会导致true或false,在MySQL中等于1或0.
BETWEEN 2 AND 'test'
转换为MySQL中的BETWEEN 2 AND 0
。
x BETWEEN a AND b
转换为x >= a AND x <= b
。
所以这种情况从未得到满足:
1 >= 2 AND 1 <= 0 => false
2 >= 2 AND 2 <= 0 => false
查询永远不会返回任何行。
更正:它表明MySQL没有解释
WHERE status = 'test' BETWEEN 2 AND 'test'
作为
WHERE (status = 'test') BETWEEN 2 AND 'test'
但是作为
WHERE status = ('test' BETWEEN 2 AND 'test')
我认为这是一个缺陷。 (编辑:我查了一下;它是一个缺陷。比较运算符=
应优先于BETWEEN
:https://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html。)
反正:
('test' BETWEEN 2 AND 'test')
始终为false,在MySQL中为0。答案 1 :(得分:0)
如果expr大于或等于min且expr小于或等于max,则BETWEEN返回1,否则返回0.这相当于表达式(min&lt; = expr AND expr&lt; = max)如果所有参数都是相同的类型。 否则,类型转换将根据第12.2节“表达式评估中的类型转换”中所述的规则进行,但适用于所有三个参数。
因此BETWEEN对整数和字符串的操作方式相同。 MySQL正在进行类型转换以便能够计算此操作。这是ANSI standard。
的一部分例如:
// returns true
select ('C' BETWEEN 'A' AND 'D');
或者更有趣:
//also returns true
select ('test' BETWEEN 'test' AND 'testa');