为什么要使用MySQL“ WHERE”子句近似值:即使不满足条件也要检索值

时间:2018-11-03 19:37:10

标签: mysql

我有一个主键为数字并自动递增的表。

当我运行查询时,例如:

SELECT * FROM my_table where id = '1a';

查询返回主键设置为“ 1”的行。

我不知道这种行为,可以预防吗? 我期望这个WHERE子句什么也不会检索,因为id是“ 1”而不是“ 1a”。它的行为就像是一个LIKE子句。

2 个答案:

答案 0 :(得分:0)

自动将字符串转换为数字,并且只接受数字前导字符。您可以改为将ID显式转换为字符串:

SELECT * FROM my_table where CAST(id AS CHAR) = '1a';

答案 1 :(得分:0)

MySQL与int列进行比较时会隐式将String文字转换为int。

您应该真正修复应用程序代码(例如:PHP),并在查询中使用它们之前正确地将其类型转换为(int)。理想情况下,您的应用程序不应该输入字符串值与整数字段进行比较。

现在,如果您无法控制输入值,则可以使用一种方法来检查该值是否为数字,并将其相应地用于比较。从sargable

改编https://dba.stackexchange.com/q/89760/160363方法
SELECT * FROM my_table 
WHERE id = CASE WHEN CONCAT('','1a'*1) = '1a' THEN '1a' ELSE NULL END;