2016-06-16 58 views
0

我有一個查詢,其中包含一些字符導致語法錯誤,因爲包含保留字符,我正在努力瞭解如何正確地轉義字符串。在WHERE ... MATCH ... AGAINST ...語句中轉義保留字符?

查詢是:

SELECT * FROM `products` 
WHERE MATCH (code, description) 
AGAINST (UPPER(+("intel"*) +("cpu"*)) IN BOOLEAN MODE) 

但是當我運行此查詢我得到以下錯誤:

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') +("cpu"*))) IN BOOLEAN MODE)' at line 1

好了,罰款不喜歡),因爲這將表明AGAINST正在關閉,但尚未(尚)。所以我試圖用反斜槓來逃避它,但它仍然會拋出同樣的錯誤。

如果我在PHP中使用準備語句嘗試此操作,同時將搜索字符串+("intel"*) +("cpu"*)綁定到它的工作語句中。所以看起來它逃避它的方式不是反斜槓或有別的東西。

所以我一直在尋找爲mysqlescapestring PHP文檔,我看到了它:「預規劃反斜槓以下字符:\ X00,\ n,\ r,\,」, 「和\ X1A」

這表明,單引號和雙引號需要進行轉義,我試圖做到這一點,但它只是拋出同樣的語法錯誤,但在雙引號字符,即to use near '\"intel\"*\)...

我不明白,這將是最好的使用準備好的語句,這解決了這個問題,但我只是想了解我在這裏做了什麼錯誤,以及如何像我這樣在AGAINST子句中像這樣跳過一個字符串這裏。

如果有人可以建議我在哪裏出錯了,那麼將不勝感激。謝謝。

+0

你想成爲AGAINST()的參數是什麼? – e4c5

+0

@ e4c5嘿,謝謝你的迴應。如果我理解這個問題,任何包含以「INTEL」和「CPU」開頭的單詞。如前所述,這是行得通的,但前提是我使用PHP進行準備,這顯然是在進行一些轉義,但我不確定它究竟在逃避什麼以及如何做。我將準備好的語句傳入以下參數:'+(「intel」*)+(「cpu」*)' –

回答

1

嗯,我設法解決這個問題。

我讀了another so question的回答,幫助我在這裏。我意識到,當準備好的聲明包含相對對象時,它用引號封裝它,因此實際上UPPER(?)將變爲UPPER("prepared string"),這意味着UPPER(+("intel"*) +("cpu"*))實際上應該是UPPER('+("intel"*) +("cpu"*)')

所以結果是:

SELECT * FROM `product` 
WHERE MATCH (code, description) 
AGAINST (UPPER('+("intel"*) +("cpu"*)') IN BOOLEAN MODE) 

做哪些工作沒有語法錯誤。

請注意,如果您在MySQL中轉義字符串,值得注意的是MySQL uses C escape syntax in strings