2011-12-20 53 views
5

在LIKE運算符中使用MySQL的模式轉義令人沮喪。使用通配符和反斜槓的MySQL LIKE運算符

[email protected]> create table foo(name varchar(255)); 
Query OK, 0 rows affected (0.02 sec) 

[email protected]> insert into foo values('with\\slash'); 
Query OK, 1 row affected (0.00 sec) 

[email protected]> insert into foo values('\\slash'); 
Query OK, 1 row affected (0.00 sec) 

[email protected]> select * from foo where name like '%\\\\%'; 
Empty set (0.01 sec) 

[email protected]> select * from foo; 
+------------+ 
| name  | 
+------------+ 
| with\slash | 
| \slash  | 
+------------+ 
2 rows in set (0.00 sec) 

[email protected]> select * from foo where name like '%\\\\%'; 
Empty set (0.00 sec) 

[email protected]> select * from foo where name like binary '%\\\\%'; 
+------------+ 
| name  | 
+------------+ 
| with\slash | 
| \slash  | 
+------------+ 
2 rows in set (0.00 sec) 

根據MySQL的文檔:http://dev.mysql.com/doc/refman/5.5/en/string-comparison-functions.html#operator_like %\\\\%是正確的操作數,但爲什麼它的產量沒有結果?

編輯: 我測試的數據庫中的character_set_database設置爲utf8。爲了進一步調查,我在character_set_database設置爲latin1的數據庫中創建了相同的設置,並猜測'%\\\\%'的工作原理!

編輯: 該問題可以重現,它是現場整理問題。詳細信息:http://bugs.mysql.com/bug.php?id=63829

+0

當我完全使用你的命令時,'select * from foo'名稱'%\\\\%';'適用於我。儘管我不明白爲什麼它不適合你,但我很遺憾,我很想知道。 –

+0

它可能與數據庫字符集有關。我已更新原始帖子。 – EnToutCas

+0

選中此項: - 'select @@ session.sql_mode; select @@ global.sql_mode;' – ajreal

回答

0

現在看來,這有一定的關係,MySQL的錯誤:http://bugs.mysql.com/bug.php?id=46659

我想你連接到MySQL不指定正確的--character-set-server選項(默認爲latin1與整理latin1_swedish_ci),並具有utf-8作爲當前控制檯的字符集。當你處理的數據應該從--character-set-server的字符集轉換爲utf8時,會導致不正確的字符轉換和比較。

2

在MySQL 5.6.10,與文本字段覈對utf8mb4_unicode_520_ci這可以通過使用5個反斜線字符,而不是4,即可以實現:

select * from foo where name like binary '%\\\\\%'; 

不知何故,事與願違,這適當地找到所有與行反斜槓。 至少這應該工作,直到上面的MySQL字段整理錯誤得到解決。考慮到這個bug已經被發現已經有5年多了,任何設計這個應用程序的應用程序在MySQL甚至被修復之前都可能超過它的用處 - 所以應該是一個非常可靠的解決方法。

0

利用Windows的MySQL 10 5.0.12開發我得到了以下結果時,我改變了查詢從

SELECT * FROM `foo` WHERE `name` LIKE '%http:\/\/%' 

SELECT * FROM `foo` WHERE `name` LIKE '%http:\\\\\\\%' 

它的工作原理,但第一個字符串與正斜槓是原始的字段內容。它似乎把反斜線解釋爲反斜槓。