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

时间:2011-10-24 19:34:27

标签: mysql select where-clause

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

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

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

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

我在这里错过了什么吗?

感谢。

4 个答案:

答案 0 :(得分:23)

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

SELECT * FROM table WHERE email='0';

答案 1 :(得分:6)

您的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 |
+-------------------------+

答案 2 :(得分:3)

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

试试,

SELECT * FROM table WHERE email='0';

答案 3 :(得分:-1)

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

SELECT * FROM table WHERE email IS NOT NULL;