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

3mpgtkmj  于 2023-08-02  发布在  Mysql
关注(0)|答案(5)|浏览(137)

请考虑此查询(演示在此)

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

cnh2zyt3

cnh2zyt31#

默认情况下,\LIKE中用作转义字符。
来自LIKEmanual
由于MySQL在字符串中使用C转义语法(例如,“\n”表示换行符),因此必须将LIKE字符串中使用的任何“\”加倍。例如,要搜索“\n”,请将其指定为“\n”。若要搜索“\”,请将其指定为“\”;这是因为反斜杠被解析器剥离一次,当模式匹配时再次剥离,留下一个要匹配的反斜杠。
您可以通过指定另一个转义符来更改此设置,如:

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

字符串

kwvwclae

kwvwclae2#

事实上,之前的所有答案都在某个地方被篡改了。正如你在Karoly Horvath提供的链接中看到的,他的有效位被Explosion Pills复制,搜索1个反斜杠(\)的正确方法是一次使用4个反斜杠(\\)
顺便说一下,为了显示上面的一个反斜杠,我必须一次使用两个,为了显示这四个,我必须使用八个。

pvabu6sv

pvabu6sv3#

为了在文本字段中找到\,我必须转义\两次,否则会找到结尾的%

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

字符串

jtjikinw

jtjikinw4#

LIKE接受两个万用字符,%_
要匹配这些字符,可以使用转义:\%\_的一个或多个。这也意味着,如果要匹配\,也必须对其进行转义。
所有这些都记录在manual中。

brccelvz

brccelvz5#

如果你想从数据库列(Test's)中删除(')并用撇号(Test's)替换它,那么你可以使用下面的查询。

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

字符串

相关问题