如何在MySQL中搜索斜杠()?为什么where(=)不需要转义(),而Like需要转义


How can I search for slash () in MySQL? And why is escaping () not required for where (=), but for Like it is required?

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

(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 "%'''%";