为什么是MySQL;其中;子句近似:即使不满足条件也检索值
我有一个主键为数字且自动递增的表 当我运行以下查询时:为什么是MySQL;其中;子句近似:即使不满足条件也检索值,mysql,Mysql,我有一个主键为数字且自动递增的表 当我运行以下查询时: SELECT * FROM my_table where id = '1a'; 查询返回主键设置为“1”的行 我没有意识到这种行为,有可能阻止它吗? 我希望WHERE子句不会检索任何内容,因为id是“1”,而不是“1a”。它的行为就像是一个like子句。自动将字符串转换为数字,并且只接受数字的前导字符。您可以将ID显式转换为字符串: SELECT * FROM my_table where CAST(id AS CHAR) = '1a';
SELECT * FROM my_table where id = '1a';
查询返回主键设置为“1”的行
我没有意识到这种行为,有可能阻止它吗?
我希望WHERE子句不会检索任何内容,因为id是“1”,而不是“1a”。它的行为就像是一个like子句。自动将字符串转换为数字,并且只接受数字的前导字符。您可以将ID显式转换为字符串:
SELECT * FROM my_table where CAST(id AS CHAR) = '1a';
MySQL隐式地将字符串文字转换为int,同时与int列进行比较 在查询中使用它们之前,您应该真正修复应用程序代码(例如:PHP),并正确地将其类型转换为
(int)
。理想情况下,应用程序不应该输入字符串值来与整数字段进行比较
现在,如果您不能控制输入值,一种方法是检查该值是否为数字,并相应地使用它进行比较。调整来自
这是因为MySQL在与整数列/字段进行比较时将
'1a'
隐式类型转换为整数
SELECT * FROM my_table
WHERE id = CASE WHEN CONCAT('','1a'*1) = '1a' THEN '1a' ELSE NULL END;