当 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
列是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 |
+-------------------------+
【讨论】:
【参考方案4】:这是因为它将电子邮件字段(我假设是 varchar 字段)转换为整数。任何没有有效整数的字段都将等于 0。您应该确保仅将字符串字段与字符串值进行比较(日期也是如此,与日期进行比较)。查询应该如下。
SELECT * FROM table WHERE email='0';
【讨论】:
你认为mysql应该这样工作吗?我认为这是很容易引入错误的地方。我不明白为什么它需要做这种没有意义的转换,比如将任何字符串转换为 0。为什么不更好地将 0 转换为 '0' - 它会更有意义以上是关于当 field=0 时,mySQL 返回所有行的主要内容,如果未能解决你的问题,请参考以下文章