2011-04-11 74 views
6

我試圖更正已經雙重轉義的數據庫中的條目。我相信當使用mysql_real_escape_string時,magic_quotes已開啓。雙重轉義導致一些搜索結果不正確或缺失。需要僅選擇包含MySQL中的反斜槓的數據

我已經關閉了magic_quotes,正計劃搜索帶有反斜槓的條目並更新它們以消除任何雙重轉義。麻煩的是,當我執行查詢來搜索帶有反斜槓的條目時,我總是得不到結果。

SELECT title FROM exampletable WHERE title LIKE '%\\\\%' 

我使用「%\\\\%」作爲在這裏推薦:http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#operator_like

如果我每輸出稱號,其中不乏有不必要的反斜線,所以我知道他們的存在。我似乎無法在查詢中隔離它們。

Example Data: 
Old King\'s Road 
Running Down A Dream 
Can\'t Stop The Sun 
This One's For Me 

再次,只是試圖返回條目與他們\。


編輯:MySQL版本是5.0.92-社區。整理是latin1_swedish_ci。字符集是UTF-8 Unicode

%\\%不起作用。我試過了。它在mysql.com上列爲不正確:

要搜索「\」,請將其指定爲「\\\\」;這是因爲反斜槓被解析器剝離了一次,並且當匹配模式匹配時,反斜槓被匹配。

+0

您不需要搜索雙斜線。只搜索'%\\%'。如果你加倍逃脫,一個\被正確解析並且你的字段數據有一個額外的\,所以你只需要搜索一個! – Khez 2011-04-11 18:31:46

+0

你使用的是什麼版本的MySQL?請發佈您的create table語句,以及數據庫的缺省字符集和排序規則。 – 2011-04-11 19:10:04

+0

MySQL版本是5.0.92-community。整理是latin1_swedish_ci。字符集是UTF-8 Unicode。對不起,目前沒有create table語句。 – 8bitsdeep 2011-04-11 19:24:48

回答

0

嘗試:

SELECT title FROM exampletable WHERE title LIKE '%\\%' 
+1

是的,忘了說我最初嘗試過。 mysql.com說四倍\是正確的,但似乎都沒有爲我工作。我已經嘗試了從1到5的任何數量的反斜槓,但沒有運氣。 – 8bitsdeep 2011-04-11 18:36:25

2

您的查詢工作正常,我在MySQL 5.5.8:

mysql> create table exampletable (
    title varchar(255) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
Query OK, 0 rows affected (0.15 sec) 

mysql> 
mysql> insert into exampletable values ('Old King\\''s Road'), 
    ('Running Down A Dream'),('Can\\''t Stop The Sun'),('This One''s For Me'); 
Query OK, 4 rows affected (0.00 sec) 
Records: 4 Duplicates: 0 Warnings: 0 

mysql> 
mysql> select * from exampletable WHERE title LIKE '%\\\\%'; 
+---------------------+ 
| title    | 
+---------------------+ 
| Old King\'s Road | 
| Can\'t Stop The Sun | 
+---------------------+ 
2 rows in set (0.01 sec) 
+0

嗯...我的是MySQL 5.0.92社區 – 8bitsdeep 2011-04-11 19:11:11

+0

我懷疑這是問題所在。你在服務器,表格和列中使用哪種字符集和排序規則? – 2011-04-11 19:25:30

5

該命令對我的作品時,我正在用PHP命令:

select * from exampletable where title like '%\\\\\\\\%' or title like '\\\\\\\\%' or title like '%\\\\'; 

我包括開始,任何地方和結束比賽的原因是要顯示他們是不同的。如果你在最後尋找反斜槓,只需要有4個反斜槓。這是因爲在它之後沒有任何東西可以逃脫。在其他命令上使用8個反斜槓,因爲它們被php解析。

+1

如果您不使用PHP,該怎麼辦?像OP一樣,例如... – 2012-10-31 22:14:47

0

在Ruby的情況下on Rails的

search_value.gsub!(/\\/, "\\\\\\\\\\") 
MyModel.where(["column_name ?","%#{search_value}%"]) 

如果你不想使用通配符,添加它們。

search_value.gsub!(/%/, "\\%").gsub!(/_/, "\\_")