如何在 MySQL 中搜索斜杠 (\)?为啥在 where (=) 中不需要转义 (\) 但对于 Like 是必需的?

Posted

技术标签:

【中文标题】如何在 MySQL 中搜索斜杠 (\\)?为啥在 where (=) 中不需要转义 (\\) 但对于 Like 是必需的?【英文标题】:How to search for slash (\) in MySQL? and why escaping (\) not required for where (=) but for Like is required?如何在 MySQL 中搜索斜杠 (\)?为什么在 where (=) 中不需要转义 (\) 但对于 Like 是必需的? 【发布时间】:2013-02-02 07:09:36 【问题描述】:

考虑这个QUERY (DEMO IS HERE)

(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\\');

【问题讨论】:

dev.mysql.com/doc/refman/5.0/en/… 在BINARY 比较模式下测试它,您将不需要额外的\\。 sqlfiddle.com/#!2/b7284/8(哇哦链接已更新) 【参考方案1】:

\ 默认在LIKE 中充当转义字符。

从manual 到LIKE

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

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

SELECT * FROM `titles` WHERE title LIKE 'test\\' ESCAPE '|'

【讨论】:

谢谢,满意的回答 :)(也为 ESCAPE +1) 为了更清楚起见,下面是一个示例,如果您尝试转义反斜杠并将 ESCAPE 字符更改为管道,则查询应该是什么样子: SELECT * FROM table WHERE column LIKE '% |\%'转义'|'【参考方案2】:

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

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

【讨论】:

这是对的。根据 mysql 文档:由于 MySQL 在字符串中使用 C 转义语法(例如,“\n”表示换行符),因此您必须将在 LIKE 字符串中使用的任何“\”加倍。 [...] 要搜索“\”,请将其指定为“\\\\” 我已经更正了 Karoly Horvath 的答案,以显示正确的反斜杠数量。 感谢您的提示 如果您的查询嵌入在 Java 代码中,则需要 8 个反斜杠。 加入聚会,如果您将转义序列编码为需要转义斜杠的字符串,您可能会输入多达 8 个!享受吧!【参考方案3】:

LIKE 接受两个通配符,%_

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

所有这些都记录在manual中。

【讨论】:

感谢您提供更多信息。【参考方案4】:

为了在文本字段中找到\,我必须两次转义\,否则找到最后的%

SELECT * FROM `table` where `field` LIKE '%\\\%';

【讨论】:

根据手册、问题本身以及此处的其他两个答案,需要 4 反斜杠。您确定这可以与 3 反斜杠一起正常工作吗?如果是这样,那就很有趣了。 我可以确认(至少在 MariaDB v10.0.33 上)3 个反斜杠的工作方式与 4 个反斜杠完全相同。【参考方案5】:

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

SELECT replace(column_name, "\\'", "'") FROM table where column_name  LIKE "%\\\%";

【讨论】:

以上是关于如何在 MySQL 中搜索斜杠 (\)?为啥在 where (=) 中不需要转义 (\) 但对于 Like 是必需的?的主要内容,如果未能解决你的问题,请参考以下文章

请问 href=\; title=\ 为啥要有个反斜杠。

为啥 .NET 会在路径中已经存在的斜杠上添加一个额外的斜杠?

MySQL中如何插入反斜杠,反斜杠被吃掉,反斜杠转义(转)

为啥在 URL 中缺少尾部斜杠 (/) 时会发生重定向?

如何使用单个反斜杠转义字符串的特殊字符

为啥从 django rest 框架返回的 JSON 在响应中有正斜杠?