带有通配符和反斜杠的MySQL LIKE运算符

EnT*_*Cas 6 mysql escaping wildcard

使用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)
Run Code Online (Sandbox Code Playgroud)

根据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

new*_*ver 0

看来它与 MySQL 错误有一些关系:http://bugs.mysql.com/bug.php ?id=46659

我认为您连接到 mysql 时未指定正确的--character-set-server选项(默认为latin1with collat​​ion latin1_swedish_ci),并且作为utf-8控制台的当前字符集。当您处理应该从 的字符集转换为 utf8 的数据时,这会导致不正确的字符转换和比较--character-set-server