如何处理带有特殊字符/(正斜杠)和\(反斜杠)的查询

问题描述 投票:0回答:6

我有一个表,其中的列允许使用特殊字符,例如“/”(正斜杠)和“”(反斜杠)。

现在,当我尝试从表中搜索此类记录时,我无法获取这些记录。

例如:abc\def 或 abc/def

我正在生成一个搜索查询,例如:

select * from table1_1 where column10 like '%abc\def%'

它返回 0 行,但实际上应该返回 1 条记录。在这种情况下我该如何编写查询?

mysql plsql
6个回答
29
投票

技巧是仅对反斜杠进行双重转义;对于字符串转义,只需要一次转义。

例如

  • 单引号
    '
    只需要转义一次
    LIKE '%\'%'
  • 但是要查询反斜杠
    \
    ,你需要双重转义到
    LIKE '%\\\\%'
  • 如果你想查询反斜杠+单引号
    \'
    那么
    LIKE '%\\\\\'%'
    (有5个反斜杠)

解释来源 摘录:

MySQL 在字符串中使用 C 转义语法(例如,“ " 来表示换行符)。如果您希望 LIKE 字符串包含文字“\”,则必须将其加倍。(除非启用了 NO_BACKSLASH_ESCAPES SQL 模式,在这种情况下不使用转义字符。)例如,搜索 ” ",将其指定为“\n”。要搜索“\”,请将其指定为“\\”;这是因为反斜杠被解析器剥离一次,并在进行模式匹配时再次剥离,留下一个反斜杠进行匹配。

例外:在模式字符串的末尾,反斜杠可以指定为“\”。在字符串的末尾,反斜杠代表其自身,因为后面没有任何内容可以转义。


15
投票

在 MySQL 中,这是有效的:

select * from Table1
where column10 like '%abc\\\\def%'

小提琴

反斜杠是字符串和

LIKE
模式的转义前缀。因此,对于
LIKE
,您需要将其加倍一次,对于字符串文字语法,需要再次加倍。


1
投票

你必须用另一个

\
来逃避
\

 select * from table1_1 where column10 like '%abc\\def%'

1
投票
当我在 MySQL v5.5 上尝试时,转义

LIKE

 值不起作用。经过几次尝试后,有效的是正则表达式(我也必须在那里转义,并将其隐藏在字符类中)。我终于让它像这样工作了:

select * from table1_1 where column10 rlike 'abc[\\]def'

这些不起作用:

... column10 like '%abc\\def%' ... column10 like concat('%abc', char(92), 'def%') ... column10 rlike 'abc\\def'

请注意,您还将此标记为 PL/SQL,即 Oracle。您发布的查询在 Oracle 上按原样运行。 PL/SQL 标签是否有误?


0
投票
使用转义。

https://dev.mysql.com/doc/refman/5.0/en/string-literals.html

表 9.1。特殊字符转义序列

序列表示的转义序列字符 ASCII NUL (0x00) 字符。

\' 单引号 (“'”) 字符。

\" 双引号 (“””) 字符。

退格字符。

换行(换行)字符。

回车符。

制表符。

\Z ASCII 26(Control+Z)。请参阅表后面的注释。

\ 反斜杠(“\”)字符。

\% 一个“%”字符。请参阅表后面的注释。

_ 一个“_”字符。请参阅表后面的注释。


0
投票
如果您使用 PHP

sprintf() 将查询放在您想要的位置:

AND column10 LIKE '%/%'



这在 sprintf() 中对我有用:

AND column10 LIKE '%%/%%'



(MySQL 8 - WAMP)

© www.soinside.com 2019 - 2024. All rights reserved.