为什么SELECT ... WHERE last_name = 0返回所有行?

时间:2015-06-12 10:41:05

标签: mysql sql

我在MySQL中有一个简单的表:

create table t_users(
    user_id INT NOT NULL AUTO_INCREMENT,
    first_name VARCHAR(100) NOT NULL,
    last_name  VARCHAR(100) NOT NULL,
PRIMARY KEY(user_id));

我很困惑地发现以下查询返回所有行:

SELECT first_name, last_name
FROM t_users
WHERE last_name = 0;

有人可以解释一下吗? 谢谢!

2 个答案:

答案 0 :(得分:14)

在MySQL中,如果比较一个字符串和一个数字,该字符串将被转换为一个数字,导致每个字符串0。并且

0 = 0

是真的。

如果字符串以数字开头 - 比如说123abc,则会产生123

SQLFiddle demo

  

当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。某些转换是隐式发生的。例如,MySQL会根据需要自动将数字转换为字符串,反之亦然。

Documentation

答案 1 :(得分:1)

原因是你正在将字符串与数字字段进行比较。 任何没有有效整数的字段都将等于0。 你应该把它比作

SELECT first_name, last_name
FROM t_users 
WHERE last_name = '0';