我有一个 mysql 查询让我一整天都困惑不已:
SELECT * FROM `table` WHERE id = "";
令我惊讶的是,这个查询返回了 id 为“0”的行。这是预期的行为吗?如果是,我应该如何排除这一行?当我传递空字符串时,我需要此查询不返回任何行。
现在id
是主键列和auto_increment
,如果这可能有帮助的话。
编辑
它变得更加有趣。我刚刚使用任意字符串运行查询,如下所示:
SELECT * FROM `table` WHERE id = "xyz";
它仍然返回 id 为零的行。看起来查询以某种方式将我的查询参数转换为 INTEGER。这对我来说是新的!
最佳答案
您查询的问题是 ""
或 "xyz"
隐式转换为 0
。尝试一下亲自看看:
SELECT CAST("" AS SIGNED), CAST("xyz" AS SIGNED)
您还可以查看 manual更好地理解隐式类型转换。
我建议在发出查询之前检查参数的值。如果用户给出了非数字值作为输入,则相应地通知他/她。
在 MySQL 中,您可以使用 this 中建议的方法。发布以检查参数值是否为数字:
SELECT *
FROM `table`
WHERE id = "" AND (CONCAT('', @param * 1) = @param);
其中@param =“”或“xyz”或“123”。
关于mysql - 查询空字符串是否应该在主键列上匹配零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33910299/