62

考虑这个查询(演示在这里

(SELECT * FROM `titles` where title = 'test\\')
UNION ALL
(SELECT * FROM `titles` where title LIKE 'test\\\\')

输出:

| ID | TITLE |
--------------
|  1 | test\ |
|  1 | test\ |

问题:

为什么(=)不需要额外的(\)而 (like) 需要额外的\\?很明显,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\\');
4

5 回答 5

122

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

手册LIKE

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

您可以通过指定另一个转义字符来更改它,如下所示:

SELECT * FROM `titles` WHERE title LIKE 'test\\' ESCAPE '|'
于 2013-02-17T21:51:10.347 回答
58

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

顺便说一句,要显示在单个反斜杠上方,我必须同时使用两个,而要显示这四个,我必须使用八个。

于 2014-11-21T12:57:10.483 回答
8

LIKE接受两个通配符%_.

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

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

于 2013-02-17T21:46:12.477 回答
6

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

SELECT * FROM `table` where `field` LIKE '%\\\%';
于 2014-03-31T07:39:01.427 回答
0

如果您想从数据库列 (Test\'s) 中删除 (\') 并将其替换为 apostrophy(Test's),那么您可以使用以下查询。

SELECT replace(column_name, "\\'", "'") FROM table where column_name  LIKE "%\\\%";
于 2019-12-27T09:49:36.933 回答