Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带通配符和反斜杠的类MySQL运算符_Mysql_Escaping_Wildcard - Fatal编程技术网

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

带通配符和反斜杠的类MySQL运算符,mysql,escaping,wildcard,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'

它对在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文档:
%\\\%
是正确的操作数,但为什么它不产生结果

编辑: 我正在测试的数据库将character\u set\u数据库设置为utf8。为了进一步调查,我在一个数据库中创建了相同的设置,该数据库的字符设置为latin1,猜猜看,
“%\\\\%”
有效

编辑:
这个问题可以重现,这是字段排序问题。详细信息:

它似乎与MySQL bug有某种关系:


我认为您连接到mysql时没有指定正确的
--character set server
选项(默认为
latin1
,带有排序规则
latin1\u-swedish\u ci
),并且将
utf-8
作为控制台的当前字符集。这会导致错误的字符转换和比较,当您在MySQL 5.6.10中使用文本字段排序规则utf8mb4_unicode_520_ci处理本应从
--character set server

的字符集转换为utf8的数据时,这可以通过使用5个反斜杠字符而不是4个字符来实现,即:

select * from foo where name like binary '%\\\\\%';
不知何故,与所有预期相反,这会正确地找到所有带有反斜杠的行。
至少在修复上面的MySQL字段排序错误之前,这应该是有效的。考虑到该漏洞已经被发现5年多了,任何使用该漏洞设计的应用程序在MySQL被修复之前都可能会失效,因此这应该是一个非常可靠的解决方法。

对于Windows 10上的MySQL 5.0.12 dev,当我从

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


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

当我准确地使用您的命令时,
select*from foo,其中的名称类似“%\\%”适合我。我不知道为什么它对您不起作用,我很好奇,它可能与数据库字符集有关。我已更新了原始帖子。请检查:-
选择@@session.sql\u模式;选择@@global.sql_模式
我还尝试创建一个新的数据库,其中
字符集\数据库
为utf8,而
'%\\\\\%'
仍然对我有效(不过我可能把它设置为utf8时出错了)。改变转义字符怎么样?类似于
从foo中选择*,其中名称类似于“%\%”ESCAPE“\\%”
,或者可能是
%\\%%
(抱歉,我无法尝试,因为我无法重现该问题)。不过,我对答案很好奇!此人也问了同样的问题,没有明确的答案,但可能有一些提示:不起作用的表有:CHARSET=utf8 COLLATE=utf8\u unicode\u ci,我不知道这里是否存在排序问题。无论如何,谢谢你。
SELECT * FROM `foo` WHERE `name` LIKE '%http:\\\\\\\%'