MySQL如何处理语句之间的异乎寻常

时间:2017-05-30 14:56:58

标签: mysql

我有一个案例,表达式不是计算,也不是字段。 不知何故,这是有效的SQL,并且这种系统的结果具有不同的排列,会产生不同的结果。

我试图找出MySQL的作用,但我无法弄清楚任何模式,也没有任何意义。

以下是查询示例:

SELECT 
*
FROM
<table>
WHERE
status = 'test'
BETWEEN
2 AND
'test';

随意替换值和数据类型。

我很欣赏这里可能发生的事情的暗示。

2 个答案:

答案 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')

我认为这是一个缺陷。 (编辑:我查了一下;它一个缺陷。比较运算符=应优先于BETWEENhttps://dev.mysql.com/doc/refman/5.7/en/operator-precedence.html。)

反正:

  • ('test' BETWEEN 2 AND 'test')始终为false,在MySQL中为0。
  • 如果status是字符串列,则转换为整数的状态将导致大多数字符串为0。仅当字符串以整数转换为数字的整数开头时。例如。 '123ABC'结果为123。
  • 如果status是数字列,则不会转换。
  • 如果status是布尔列,则转换为0表示false,1表示true表示。
  • 所以有些行会返回,有些则不会。

答案 1 :(得分:0)

来自MySQL documentation

  

如果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');

有关详情,请查看herehere