mysql - 查询空字符串是否应该在主键列上匹配零?

标签 mysql select

我有一个 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/

相关文章:

mysql - SQL中同一行的列值中的第二大值

mysql - 插入 ID 号而不是使用 Enum 类型 - 查询会变慢多少?

mysql - 如何查询哪个员工已全职工作

Mysql 程序。更新并选择

Python SQL Select 语法,中间有变量

c# - 带有 optgroup 和 knockoutJS 的选择框

python - Django transaction.commit_on_success 不回滚事务

mysql - 更改表内容

mysql - `UPDATE ... WHERE ... ` InnoDB 多行锁定

mysql — 返回未被其他人更新的行