如何在MySQL中搜索斜杠(\)?以及为什么转义 (\) 对于 where (=) 不是必需的,但对于 Like 是必需的?

2022-08-30 08:53:23

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

(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\\');

答案 1

\默认情况下,在 中用作转义字符。LIKE

手册中:LIKE

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

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

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

答案 2

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

顺便说一句,为了在上面显示单个反斜杠,我必须一次使用两个,并且为了显示这四个,我必须使用八个。


推荐