如何在 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 是必需的?的主要内容,如果未能解决你的问题,请参考以下文章