当 field=0 时,mySQL 返回所有行

Posted

技术标签:

【中文标题】当 field=0 时,mySQL 返回所有行【英文标题】:mySQL returns all rows when field=0 【发布时间】:2011-12-14 10:06:21 【问题描述】:

我正在做一些测试,当我查询一个表时,这是一个惊喜,查询SELECT * FROM table WHERE email=0返回了表中的所有行。

此表没有“0”值,并且填充了常规电子邮件。

为什么会这样?这可能会导致严重的安全问题。

有没有办法在不修改查询的情况下避免这种情况?

我错过了什么吗?

谢谢。

【问题讨论】:

【参考方案1】:

电子邮件字段可能是字符,并且您正在匹配数值。

试试看,

SELECT * FROM table WHERE email='0';

【讨论】:

【参考方案2】:

如果您想获取电子邮件列不应为空或为空的所有记录,则可以使用

SELECT * FROM table WHERE email IS NOT NULL;

【讨论】:

【参考方案3】:

您的email 列是CHARVARCHAR 类型。当您使用条件email = 0 时,mysql 会将email 列的内容转换为整数,以便将它们与您提供的 0 进行比较。如果您将 0 括在引号中,则查询将按预期工作。 (email = '0')

在 MySQL 中将非数字字符串转换为整数会得到 0。

mysql> SELECT CAST('email@example.com' AS SIGNED);
+-------------------------------------+
| CAST('email@example.com' AS SIGNED) |
+-------------------------------------+
|                                   0 |
+-------------------------------------+

相比之下,如果您尝试对数字字符串进行相同的操作,它们可能会正确转换:

mysql> SELECT CAST('12345' AS SIGNED);
+-------------------------+
| CAST('12345' AS SIGNED) |
+-------------------------+
|                   12345 |
+-------------------------+

【讨论】:

【参考方案4】:

这是因为它将电子邮件字段(我假设是 varchar 字段)转换为整数。任何没有有效整数的字段都将等于 0。您应该确保仅将字符串字段与字符串值进行比较(日期也是如此,与日期进行比较)。查询应该如下。

SELECT * FROM table WHERE email='0';

【讨论】:

你认为mysql应该这样工作吗?我认为这是很容易引入错误的地方。我不明白为什么它需要做这种没有意义的转换,比如将任何字符串转换为 0。为什么不更好地将 0 转换为 '0' - 它会更有意义

以上是关于当 field=0 时,mySQL 返回所有行的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询返回 0 行,而 DB 中返回 2

当跟踪中的语句返回 1 时,为啥 perl DBI 返回 0 行

Python mysql.connector 不返回所有行

CI MySQL查询连接表和where语句不返回所有行

MySQL InnoDB 表返回 20% 的行然后停止

MYSQL如果一个选择查询返回0行然后另一个选择查询?