2011-11-11 23 views
0

如果我有一個MySQL查詢,如:一次講話商標查詢

SELECT this FROM that WHERE id='10' 

SELECT this FROM that WHERE id=10 

似乎都正常工作。

什麼是在MySQL查詢中使用單一的語音標記?什麼時候使用它們是正確的?

+0

[如何在mysql插入語句中包含PHP變量](http:// stackoverflow。com/questions/7537377/how-to-include-a-php-variable-inside-a-mysql-insert-statement) –

+2

順便說一句,它們通常被稱爲*單引號*。 –

+0

@ Col.Shrapnel:這不是重複的。這只是一個關於MySQL語法的問題;它與PHP界面無關。 –

回答

1

如果該值是一個字符串,你必須使用'"

如果該值是一個數字,就像在你的榜樣,你還沒有使用',但MySQL的處理它,如果你把它掛'秒。

0

你應該總是使用它們。他們可以幫助阻止SQL injection攻擊,因爲mysql_real_escape_string是不夠的。

這是假設你通過PHP運行查詢。

+0

哎呦......這應該是一條評論... –

1

假設id是數字列,什麼情況是,MySQL的自動轉換您的參數號碼,數據類型比較之前匹配。它完美地工作,除非鑄造提供意想不到的結果。例如,這些表達與匹配ID行= 10,因爲所有的字符串轉換爲:

id='10' 
id=' 10' 
id='00010' 
id='10foo' 

下不會行,因爲非可解析字符串轉換爲和10 <匹配> 0:

id='foo10' 
id='bar' 

什麼時候使用?如果你想要一個字符串,你需要需要引用它(沒有其他的方式來鍵入一個字符串,並獲得有效的SQL)。如果你想要一個數字,它必須不加引號(否則,你會得到一個恰好包含數字的字符串)。當然,您始終可以將數字作爲字符串提供,並讓MySQL執行轉換,但除了一個額外的步驟以外,它不會真正爲查詢添加任何內容,並且可能會導致不被注意的錯誤結果。

3

當MySQL執行查詢,存在參數的隱式轉換。 如果id是INT,則將'10'轉換爲整數。 如果id是VARCHAR或其他文本類型,則將10轉換爲字符串。 在這兩種情況下,這兩個查詢都可以工作(除非您在STRICT模式下運行)。

從性能的角度來看,你必須使用正確的數據類型(不使用整數參數報價) - 的隱式轉換的開銷增加,並且某些情況下,可能會傷害索引查詢的性能。

從安全的角度來看,它更容易總是使用引號和參數沒有加引號mysql_real_escape_string(萬一,mysql_real_escape_string不會停止任何攻擊,不使用引號,例如「UNION SELECT password FROM users」。但是,更好的方法是將您的變量強制轉換爲int,或者使用prepared statements

+0

+1方式比接受的答案更豐富:) –