2011-10-24 22 views
15

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

此表格没有“0”值,并且它填充了普通的电子邮件。

为什么会发生这种情况?这可能会导致严重的安全问题。

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

我在这里错过了什么吗?

谢谢。

回答

21

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

SELECT * FROM table WHERE email='0'; 
+3

你认为MySQL的应该以这种方式工作?我认为这是容易引入错误的地方。我不明白为什么它需要这样做没有意义的转换,例如将任何字符串转换为0.为什么不把它转换为0更好 - 它会更有意义 –

6

email列是一个CHARVARCHAR类型。当您使用条件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 | 
+-------------------------+ 
-1

,如果你想在电子邮件列不应该是空白或空的所有记录,那么你可以使用

SELECT * FROM table WHERE email IS NOT NULL; 
3

电子邮件字段可能是字符,并且您与数字值匹配。

与尝试,

SELECT * FROM table WHERE email='0';