【发布时间】:2011-12-20 23:06:21
【问题描述】:
对 LIKE 运算符中使用的 MySQL 模式转义感到沮丧。
root@dev> create table foo(name varchar(255));
Query OK, 0 rows affected (0.02 sec)
root@dev> insert into foo values('with\\slash');
Query OK, 1 row affected (0.00 sec)
root@dev> insert into foo values('\\slash');
Query OK, 1 row affected (0.00 sec)
root@dev> select * from foo where name like '%\\\\%';
Empty set (0.01 sec)
root@dev> select * from foo;
+------------+
| name |
+------------+
| with\slash |
| \slash |
+------------+
2 rows in set (0.00 sec)
root@dev> select * from foo where name like '%\\\\%';
Empty set (0.00 sec)
root@dev> 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
【问题讨论】:
-
当我完全使用你的命令时,
select * from foo where name like '%\\\\%';为我工作。我不知道为什么它对你不起作用,我很想知道。 -
可能与数据库字符集有关。我已经更新了原帖。
-
检查这个:-
select @@session.sql_mode; select @@global.sql_mode; -
我还尝试创建一个新的数据库,
character_set_database是 utf8,'%\\\\%'仍然对我有用(虽然我可能把它正确地设置为 utf8)。如何更改转义字符?比如SELECT * from foo where name like '%|\%' ESCAPE '|',或者%|\\%(抱歉,我无法尝试,因为我无法重现问题)。不过我对答案很好奇!这个人也问了同样的问题,没有明确的答案,但可能有一些提示:stackoverflow.com/questions/5625698/… -
不起作用的表有:CHARSET=utf8 COLLATE=utf8_unicode_ci,我不知道排序规则是否可能是这里的问题。还是谢谢。