Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么是MySQL;其中;子句近似:即使不满足条件也检索值_Mysql - Fatal编程技术网

为什么是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;