【发布时间】:2011-12-14 10:06:21
【问题描述】:
我正在做一些测试,当我查询一个表时,这是一个惊喜,查询SELECT * FROM table WHERE email=0返回了表中的所有行。
此表没有“0”值,并且填充了常规电子邮件。
为什么会这样?这可能会导致严重的安全问题。
有没有办法在不修改查询的情况下避免这种情况?
我错过了什么吗?
谢谢。
【问题讨论】:
标签: mysql select where-clause
我正在做一些测试,当我查询一个表时,这是一个惊喜,查询SELECT * FROM table WHERE email=0返回了表中的所有行。
此表没有“0”值,并且填充了常规电子邮件。
为什么会这样?这可能会导致严重的安全问题。
有没有办法在不修改查询的情况下避免这种情况?
我错过了什么吗?
谢谢。
【问题讨论】:
标签: mysql select where-clause
电子邮件字段可能是字符,并且您正在匹配数值。
试试看,
SELECT * FROM table WHERE email='0';
【讨论】:
如果您想获取电子邮件列不应为空或为空的所有记录,则可以使用
SELECT * FROM table WHERE email IS NOT NULL;
【讨论】:
您的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 |
+-------------------------+
【讨论】:
这是因为它将电子邮件字段(我假设是 varchar 字段)转换为整数。任何没有有效整数的字段都将等于 0。您应该确保仅将字符串字段与字符串值进行比较(日期也是如此,与日期进行比较)。查询应该如下。
SELECT * FROM table WHERE email='0';
【讨论】: