我有一个主键为数字并自动递增的表。
当我运行查询时,例如:
SELECT * FROM my_table where id = '1a';
查询返回主键设置为“ 1”的行。
我不知道这种行为,可以预防吗? 我期望这个WHERE子句什么也不会检索,因为id是“ 1”而不是“ 1a”。它的行为就像是一个LIKE子句。
答案 0 :(得分:0)
mysql自动将字符串转换为数字,并且只接受数字前导字符。您可以改为将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;