我在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;
有人可以解释一下吗? 谢谢!
答案 0 :(得分:14)
在MySQL中,如果比较一个字符串和一个数字,该字符串将被转换为一个数字,导致每个字符串0
。并且
0 = 0
是真的。
如果字符串以数字开头 - 比如说123abc
,则会产生123
。
当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。某些转换是隐式发生的。例如,MySQL会根据需要自动将数字转换为字符串,反之亦然。
答案 1 :(得分:1)
原因是你正在将字符串与数字字段进行比较。 任何没有有效整数的字段都将等于0。 你应该把它比作
SELECT first_name, last_name
FROM t_users
WHERE last_name = '0';