我正在进行一些测试,当我查询表格时,这是一个惊喜,查询SELECT * FROM table WHERE email=0
返回了表格中的所有行。
此表没有“0”值,并且填充了常规电子邮件。
为什么会这样?这可能会导致严重的安全问题。
有没有办法在不修改查询的情况下避免这种情况?
我在这里错过了什么吗?
感谢。
答案 0 :(得分:23)
这是因为它正在将电子邮件字段(我假设是一个varchar字段)转换为整数。任何没有有效整数的字段都将等于0.您应该确保只将字符串字段与字符串值进行比较(日期相同,与日期比较)。查询应如下所示。
SELECT * FROM table WHERE email='0';
答案 1 :(得分:6)
您的email
列是CHAR
或VARCHAR
类型。当您使用条件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;