考虑这个查询(演示在这里)
(SELECT * FROM `titles` where title = 'test''')
UNION ALL
(SELECT * FROM `titles` where title LIKE 'test''''')
输出:
| ID | TITLE |
--------------
| 1 | test' |
| 1 | test' |
问题:
为什么(=)不需要额外的?很明显,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''');
'
在LIKE
中充当转义符。
来自LIKE
:手册
因为MySQL在字符串中使用C转义语法(例如,"''n"表示换行符),所以必须将LIKE字符串中使用的任何"''"加倍。例如,要搜索"''n",请将其指定为"''''n"。要搜索"''",请将其指定为"''''''''";这是因为解析器将反斜杠剥离一次,当模式匹配时,将再次剥离,留下一个要匹配的反斜杠。
您可以通过指定另一个转义符来更改这一点,如:
SELECT * FROM `titles` WHERE title LIKE 'test''' ESCAPE '|'
实际上,以前的所有答案都被篡改了。正如您在Karoly Horvath提供的链接中看到的,其有效位由爆炸药丸复制,搜索1个反斜杠('')的正确方法是同时使用4个反斜杠。
顺便说一下,要在上面显示那个反斜杠,我必须同时使用两个,要显示这四个,我必须使用八个。
为了在文本字段中找到'
,我必须两次逃离'
,否则会找到末尾的%
:
SELECT * FROM `table` where `field` LIKE '%'''%';
LIKE
接受两个通配符%
和_
。
为了能够匹配这些字符,可以使用转义:'%
、'_
。这也意味着,如果要匹配'
,也必须对其进行转义。
所有这些都记录在手册中。
如果您想从数据库列(Test)中删除(')并用撇号(Test)替换它,那么您可以使用以下查询。
SELECT replace(column_name, "'''", "'") FROM table where column_name LIKE "%'''%";