2015-11-25 27 views
0

我有這樣的MySQL查詢已讓我一整天完全難倒:查詢主鍵列上的空字符串是否匹配零?

SELECT * FROM `table` WHERE id = ""; 

我很驚訝的是,該查詢返回一行其中id爲「0」。這是預期的行爲?如果是的話,我應該如何排除這一行?當我傳遞空字符串時,我需要這個查詢來返回沒有行。

現在id是主鍵列和auto_increment,如果這可能有所幫助。

編輯

它會變得更加有趣。我剛剛使用任意字符串運行查詢,如下所示:

SELECT * FROM `table` WHERE id = "xyz"; 

它仍然返回ID爲零的行。它看起來像查詢是以某種方式將我的查詢參數轉換爲INTEGER。這對我來說是新的!

回答

0

與您查詢的問題是,"""xyz"隱含轉換爲0。試試這個看自己:

SELECT CAST("" AS SIGNED), CAST("xyz" AS SIGNED) 

您還可以看看manual更好地瞭解隱式類型轉換。

我會建議在發出查詢之前檢查參數的值。如果用戶輸入了非數字值作爲輸入,則相應地通知他/她。

在MySQL可以使用一種方法,this交建議檢查參數值是數字:

SELECT * 
FROM `table` 
WHERE id = "" AND (CONCAT('', @param * 1) = @param); 

其中@參數=「」或「XYZ」或「123」。

+0

是的。我猜「隱式類型轉換」是怎麼回事。當我提醒說'SELECT'xyz「= 0;'yield'TRUE'時,我感到很有趣。所以,我認爲問題是由這個和(不常見的)」0「值的組合INTEGER列。 –

0

它將返回false

IF('', 'true', 'false') 

或 它將返回false

IF('', 'true', 'false') 

對於MySQL的意義zero''表示假

Read more

0

如@Giorgos指出的那樣,考慮隱式類型轉換,「意外」行爲確實是預期的行爲。推遲到那時,我相信實現我想要在此查詢的最簡單的方法是:

SELECT * FROM `table` WHERE CAST(`id` AS CHAR)=""; 
SELECT * FROM `table` WHERE CAST(`id` AS CHAR)="xyz"; 
SELECT * FROM `table` WHERE CAST(`id` AS CHAR)="123"; 

這樣,爭論的雙方都STRING和蘋果是比蘋果。

這就是說,我會接受@ Giogos的答案。它確實指出瞭解決方案。