2011-10-24 25 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';