如何在MySQL中搜索斜杠(\)?为什么逃避(\)不需要where(=)但是对于Like是必需的?

时间:2013-02-17 21:39:35

标签: php mysql sql escaping

考虑此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\ |

问题:

为什么(=)不需要额外的(\),但是需要额外的 \\ ? 很明显,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 个答案:

答案 0 :(得分:75)

默认情况下,

\LIKE中用作转义字符。

来自LIKE的{​​{3}}:

  

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

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

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

答案 1 :(得分:33)

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

顺便说一下,为了显示单个反斜杠,我必须同时使用两个,并显示这四个我必须使用八个。

答案 2 :(得分:6)

LIKE接受两个野性字符%_

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

所有这些都记录在manual

答案 3 :(得分:3)

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

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

答案 4 :(得分:0)

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

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