如何在MySQL中搜索斜杠(\)?为什么逃避(\)不需要where(=)但是对于Like是必需的?

40 php mysql sql escaping

考虑这个QUERY(DEMO在这里)

(SELECT * FROM `titles` where title = 'test\\')
UNION ALL
(SELECT * FROM `titles` where title LIKE 'test\\\\')
Run Code Online (Sandbox Code Playgroud)

输出:

| ID | TITLE |
--------------
|  1 | test\ |
|  1 | test\ |
Run Code Online (Sandbox Code Playgroud)

题:

为什么(= )需要额外的(\),但是(如)需要额外的\\?很明显,MySQL 使用(test \\)转义(test\)然后使用(test \\\\)对LIKE是合乎逻辑的.

表信息:

CREATE TABLE IF NOT EXISTS `titles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

--
-- Dumping data for table `titles`
--

INSERT INTO `titles` (`id`, `title`) VALUES
(1, 'test\\');
Run Code Online (Sandbox Code Playgroud)

Exp*_*lls 83

\LIKE默认情况下,它用作转义字符.

手动LIKE:

因为MySQL在字符串中使用C转义语法(例如,"\n"表示换行符),所以必须将在LIKE字符串中使用的任何"\"加倍.例如,要搜索"\n",请将其指定为"\\n".要搜索"\",请将其指定为"\\\\"; 这是因为反斜杠被剥离解析器一次,并再次当模式匹配成功,留下一个反斜杠对要匹配.

您可以通过指定另一个转义字符来更改此设置,如:

SELECT * FROM `titles` where title LIKE 'test\\' ESCAPE '|'
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,满意的答案:)(也为ESCAPE +1) (2认同)
  • 为了更加清晰起见,如果您尝试转义反斜杠并将 ESCAPE 字符更改为管道,则查询应如下所示: SELECT * FROM table WHERE column LIKE '%|\%' ESCAPE '|' (2认同)

aer*_*ino 40

实际上,之前的所有答案都在某处被破坏了.正如您在Karoly Horvath提供的链接中所看到的,其重要位由Explosion Pills复制,搜索1个反斜杠(\)的正确方法是一次使用4个反斜杠(\\\\).

顺便说一下,为了显示单个反斜杠,我必须同时使用两个,并显示这四个我必须使用八个.


Kar*_*ath 7

LIKE接受两个wildchar字符,%_.

为了能够匹配这些字符,可以使用转义:\%,\_.这也意味着如果你想匹配\,它也必须被转义.

所有这些都记录在手册中.


小智 6

为了\在文本字段中找到 a我不得不转义\两次,否则%在最后找到了:

SELECT * FROM `table` where `field` LIKE '%\\\%';
Run Code Online (Sandbox Code Playgroud)