2011-12-20 52 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:\\\\\\\%' 

它的工作原理,但第一个字符串与正斜杠是原始的字段内容。它似乎把反斜线解释为反斜杠。