9

我正在尝试在 mysql 语句中使用 LIKE 子句,如下所示:

SELECT * FROM batches WHERE FilePath LIKE '%Parker_Apple_Ben_20-10-1956%'

'FilePath' 列中的数据匹配数据为:

C:\SCAN\Parker_Apple_Ben_20-10-1830\TEST

上面的 SQL 语句工作正常并拾取相关行,但如果我将“\”字符添加到 LIKE 子句的末尾(如下所示),它不会正确拾取该行:

SELECT * FROM batches WHERE FilePath LIKE '%Parker_Apple_Ben_20-10-1956\%'

有趣的是,如果我在 LIKE 子句的开头放置一个 '\' 字符(如下所示),它会很好地拾取该行 - 这让我感到困惑。

SELECT * FROM batches WHERE FilePath LIKE '%\Parker_Apple_Ben_20-10-1956%'
4

6 回答 6

11

在 LIKE 中,_是一个匹配单个字符的通配符,因此需要转义才能正确匹配文字 '_' 而不是可能匹配任何内容。此外,您还提到尝试将以 1830 结尾的字符串与以 1956 结尾的类似字符串进行匹配。最后,正如 JW 和 MySQL 文档所提到的,您需要两次转义反斜杠

http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#operator_like

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

尝试

SELECT * FROM batches 
WHERE FilePath LIKE '%Parker\_Apple\_Ben\_20-10-1830\\\\%'

http://sqlfiddle.com/#!2/3ce74/3

于 2013-04-04T12:09:18.817 回答
3

添加\当前查询转义%,试试这个

SELECT * FROM batches WHERE FilePath LIKE '%Parker\_Apple\_Ben\_20-10-1956\\\\%'

要搜索“\”,请将其指定为“\\\\”;这是因为反斜杠被解析器剥离一次,并且在进行模式匹配时再次剥离,留下一个反斜杠进行匹配。

于 2013-04-04T11:58:37.443 回答
2

使用四重转义:

SELECT * FROM batches WHERE FilePath LIKE '%Parker_Apple_Ben_20-10-1956\\\\%'

在这里解释

于 2013-04-04T12:00:26.540 回答
0

您应该转义您的 '\' 字符。试试这个:

SELECT * FROM batches WHERE FilePath LIKE '%Parker_Apple_Ben_20-10-1956\\%'
于 2013-04-04T11:58:08.240 回答
0

这是因为\%在 MySQL 中是一个转义字符,有关更多信息,请参阅以下内容:

https://stackoverflow.com/a/881208/1666167

于 2013-04-04T11:58:38.270 回答
0

您应该在 mysql 中转义特殊字符,如 \、'、_ 等,如\\, \',\_

于 2013-04-04T12:00:03.730 回答