请考虑此查询(演示在此)
(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\\');
型
5条答案
按热度按时间cnh2zyt31#
默认情况下,
\
在LIKE
中用作转义字符。来自
LIKE
的manual:由于MySQL在字符串中使用C转义语法(例如,“\n”表示换行符),因此必须将LIKE字符串中使用的任何“\”加倍。例如,要搜索“\n”,请将其指定为“\n”。若要搜索“\”,请将其指定为“\”;这是因为反斜杠被解析器剥离一次,当模式匹配时再次剥离,留下一个要匹配的反斜杠。
您可以通过指定另一个转义符来更改此设置,如:
字符串
kwvwclae2#
事实上,之前的所有答案都在某个地方被篡改了。正如你在Karoly Horvath提供的链接中看到的,他的有效位被Explosion Pills复制,搜索1个反斜杠(\)的正确方法是一次使用4个反斜杠(\\)。
顺便说一下,为了显示上面的一个反斜杠,我必须一次使用两个,为了显示这四个,我必须使用八个。
pvabu6sv3#
为了在文本字段中找到
\
,我必须转义\
两次,否则会找到结尾的%
:字符串
jtjikinw4#
LIKE
接受两个万用字符,%
和_
。要匹配这些字符,可以使用转义:
\%
,\_
的一个或多个。这也意味着,如果要匹配\
,也必须对其进行转义。所有这些都记录在manual中。
brccelvz5#
如果你想从数据库列(Test's)中删除(')并用撇号(Test's)替换它,那么你可以使用下面的查询。
字符串