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
看来它与 MySQL 错误有一些关系:http://bugs.mysql.com/bug.php ?id=46659
我认为您连接到 mysql 时未指定正确的--character-set-server选项(默认为latin1with collation latin1_swedish_ci),并且作为utf-8控制台的当前字符集。当您处理应该从 的字符集转换为 utf8 的数据时,这会导致不正确的字符转换和比较--character-set-server。