2011-09-08 64 views
2

我的查詢是SELECT * FROM PMT_PROJECT WHERE PROJECT_CODE LIKE '%A3\7\2011%' AND COMPANY_ID=14。 PROJECT_CODE列包含完全匹配記錄,但是,我的上述查詢無法從MySql數據庫獲取記錄。請糾正我的關於\特殊字符的語法,如果在上面的查詢中有錯誤或者建議我如何獲取上述記錄。像在特殊字符的mysql

+0

可能重複[如何逃脫在MySQL特殊字符(http://stackoverflow.com/questions/ 881194 /如何逃生特殊字符在MySQL) – ajreal

+0

我的查詢是不是給出任何錯誤,它無法取得記錄,並假設我改變上面是像%A3/7/2011%',如果記錄存在在我的數據庫然後它會獲取記錄 – subodh

回答

7

反斜槓在mysql中很困難。我只是直接從mysql客戶跑了測試,發現添加字段,你做單逃逸(兩個反斜槓):

INSERT INTO mytable (field1) VALUES ('ASDFA3\\7\\2011QWER'); 

但隨着LIKE命令,需要逃逸按字面表示,所以你需要仔細逃脫聲明(四個反斜槓):

SELECT * FROM mytable WHERE field1 LIKE '%A3\\\\7\\\\2011%'; 

再加上逃逸必要讓你的應用層,它可以得到相當混亂。另一種方法是使用單個字符通配符:

SELECT * FROM mytable WHERE field1 LIKE '%A3_7_2011%'; 

另一種方法是使用 'NO_BACKSLASH_ESCAPES' 模式:

SET SESSION sql_mode='NO_BACKSLASH_ESCAPES'; 
SELECT * FROM mytable WHERE field1 LIKE '%A3\7\2011%'; 

EDIT(感謝,lucek):

或者,以保留當前sql_mode:

SET @temp_sql_mode = @@SESSION.sql_mode; 
SET SESSION sql_mode = CONCAT_WS(',', @@SESSION.sql_mode, 'NO_BACKSLASH_ESCAPES'); 
-- YOUR_SELECT_GOES_HERE; 
SET SESSION sql_mode = @temp_sql_mode; 
+0

非常感謝它幫助我感謝.... – subodh

+0

後執行此SET SESSION sql_mode ='NO_BACKSLASH_ESCAPES';如何設置SET SESSION sql_mode默認。 – subodh

+0

只要做一個'SET SESSION sql_mode ='';' –

0

反斜槓是MySQL中的標準轉義字符。如果你想從字面上使用反斜槓字符,你必須定義此查詢另一個轉義字符:

SELECT * 
FROM PMT_PROJECT 
WHERE PROJECT_CODE LIKE '%A3\7\2011%' ESCAPE '|' AND COMPANY_ID=14 
+0

我試圖找到「ESCAPE'字符'」的文檔,但沒有提出任何內容。你可以用ESCAPE指向我的MySQL文檔嗎? – matt

+0

http://dev.mysql.com/doc/refman/5.5/en/string-comparison-functions.html –