我正在进行一些测试,当我查询表时查询SELECT * FROM table WHERE email=0
返回表中的所有行,这是一个惊喜。mySQL在字段= 0时返回所有行
此表格没有“0”值,并且它填充了普通的电子邮件。
为什么会发生这种情况?这可能会导致严重的安全问题。
有没有办法避免这种情况而不修改查询?
我在这里错过了什么吗?
谢谢。
我正在进行一些测试,当我查询表时查询SELECT * FROM table WHERE email=0
返回表中的所有行,这是一个惊喜。mySQL在字段= 0时返回所有行
此表格没有“0”值,并且它填充了普通的电子邮件。
为什么会发生这种情况?这可能会导致严重的安全问题。
有没有办法避免这种情况而不修改查询?
我在这里错过了什么吗?
谢谢。
这是因为它将电子邮件字段(我认为是一个varchar字段)转换为整数。任何没有有效整数的字段将等于0.您应该确保只将字符串字段与字符串值进行比较(日期相同,与日期相比)。查询应该如下。
SELECT * FROM table WHERE email='0';
你email
列是一个CHAR
或VARCHAR
类型。当您使用条件email = 0
时,MySQL正在将email
列的内容转换为整数,以便将它们与您提供的0进行比较。如果你用引号包围0,查询将按预期工作。 (email = '0'
)
转换一个非数字字符串在MySQL的整数会导致0
mysql> SELECT CAST('[email protected]' AS SIGNED);
+-------------------------------------+
| CAST('[email protected]' AS SIGNED) |
+-------------------------------------+
| 0 |
+-------------------------------------+
相反,如果你试图用数字字符串一样的东西,他们可能会正确地投:
mysql> SELECT CAST('12345' AS SIGNED);
+-------------------------+
| CAST('12345' AS SIGNED) |
+-------------------------+
| 12345 |
+-------------------------+
,如果你想在电子邮件列不应该是空白或空的所有记录,那么你可以使用
SELECT * FROM table WHERE email IS NOT NULL;
电子邮件字段可能是字符,并且您与数字值匹配。
与尝试,
SELECT * FROM table WHERE email='0';
你认为MySQL的应该以这种方式工作?我认为这是容易引入错误的地方。我不明白为什么它需要这样做没有意义的转换,例如将任何字符串转换为0.为什么不把它转换为0更好 - 它会更有意义 –