2014-01-18 85 views
0

我正在使用php mysql_query()從我的SQL數據庫中選擇行,但出於某種原因,它選擇的行與查詢不匹配。例如:SQL SELECT正在選擇與查詢不匹配的行

mysql_query("SELECT * FROM Table WHERE ID='153'") 

這將返回誰擁有的153

的ID,但這樣會行:

mysql_query("SELECT * FROM Table WHERE ID='153c'") 

難道我做錯了什麼?

+3

將數字字符串數據隱式轉換爲數字...... –

+0

mysql_query(SELECT * FROM Table WHERE ID ='153c'「)您在這行代碼中缺少一個雙重qoutes – zee

+0

缺少的報價只是一個錯誤地輸入問題,但@MitchWheat是正確的。 – Zach

回答

1

如上所述,問題是將字符串值與整數值進行比較。你的表達是:

​​

你可以想像MySQL的引擎描述它的作用爲:「id是一個整數列,因此,我需要把它比作一個整數值哦,右側是一個字符串。 ,所以我會將右側轉換爲整數。「

MySQL將值從字符串轉換爲數字的方式可稱爲「靜音轉換」。它轉換找到的最長的前導號碼,然後停止。如果沒有前導號碼(如'a123'),則值爲0。沒有錯誤產生。

如果你真的想迷惑自己,考慮以下因素:

select (case when 123 = '123e' then 1 else 0 end), 
     (case when 123 = '123e3' then 1 else 0 end), 
     (case when 123 = '123a' then 1 else 0 end), 
     (case when 123 = '123a3' then 1 else 0 end) 

這將返回:真的,假的,真正的,真實的。爲什麼第二個是假的,但其他的是真的?那麼,'123e3'被解釋爲科學記數法,所以價值變成了123,000。對於所有其他人,轉換停止在第一個字母字符處。

正如在其他答案中提到的,顯而易見的解決方法是將單引號放在常量上。

0

爲什麼您將ID值作爲字符串傳遞?這很可能是你的問題。嘗試通過以下查詢代替:

mysql_query("SELECT * FROM Table WHERE ID= 153") 

通過這種方式,被搜索的ID值是一個int(或任何其它原語的ID列被設置爲)。這應該適當地限制ID。另外,如果您使用數字創建ID,最好只使用不同的整數而不使用字符串。