【问题标题】:MySQL LIKE operator with wildcard and backslash带有通配符和反斜杠的 MySQL LIKE 运算符
【发布时间】: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,我不知道排序规则是否可能是这里的问题。还是谢谢。

标签: mysql escaping wildcard


【解决方案1】:

在 MySQL 5.6.10 中,使用文本字段排序规则 utf8mb4_unicode_520_ci 这可以通过使用 5 个反斜杠字符而不是 4 个字符来实现,即:

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

不知何故,出乎所有人的意料,这正确地找到了所有带有反斜杠的行。 至少在上面的 MySQL 字段排序错误被修复之前,这应该可以工作。考虑到该漏洞被发现已超过 5 年,任何使用此设计的应用程序都可能在 MySQL 被修复之前就已经失效 - 所以应该是一个非常可靠的解决方法。

【讨论】:

    【解决方案2】:

    在 Windows 10 上使用 MySQL 5.0.12 dev 从

    更改查询时得到以下结果
    SELECT * FROM `foo` WHERE `name` LIKE '%http:\/\/%'
    

    到

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

    它可以工作,但带有正斜杠的第一个字符串是原始字段内容。它似乎将正斜杠解释为反斜杠。

    【讨论】:

      【解决方案3】:

      它似乎与那个 MySQL 错误有关:http://bugs.mysql.com/bug.php?id=46659

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

      【讨论】:

        猜你喜欢
        • 2013-02-08
        • 2012-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-04
        • 1970-01-01
        • 2014-06-24
        • 1970-01-01
        相关资源
        最近更新 更多