如何在MySql中搜索类似O'%的短语?

时间:2012-01-10 17:31:21

标签: mysql

我有一个包含人名的MySql数据库。当然,存储的名称以O'开头。

如果我尝试用这样的sql检索名称“O'Brien”: -

SELECT person_sname
FROM people
WHERE person_sname = 'O\\\'Brien'

然后我得到了预期的结果。但是,如果我尝试检索所有以“O”开头的名称,如下所示: -

SELECT person_sname
FROM people
WHERE person_sname like 'O\\\'Brien'

然后我得到一个空的结果集。我的目标是搜索like "O\\\'"

有没有解释为什么会这样?我搜索了MySql手册,但没有找到解释为什么我的搜索不能按预期工作的原因。

我发现的其他问题涉及存储转义字符串或使用=检索它并且无故障地工作,我特别想在这个场合使用like子句。

澄清:我也尝试了以下内容: -

SELECT person_sname
FROM people
WHERE person_sname like 'O\'Brien' escape "\'"

SELECT person_sname
FROM people
WHERE person_sname like 'O\'Brien'

SELECT person_sname
FROM people
WHERE person_sname LIKE 'O\'Brien'
ESCAPE '~'

字符串在插入到db usimg mysql_real_escape_string()时被转义,并存储为O\'Brien(例如)。

4 个答案:

答案 0 :(得分:3)

你正在注入一个字面反斜杠。这就足够了:

SELECT person_sname
FROM people
WHERE person_sname = 'O\'Brien'

测试:

SELECT 'O\\\'Brien', 'O\'Brien'

更新:已经有一个已接受的答案,所以我只想补充一些说明。

首先,我忽略了存储数据已损坏的事实。不用说,这解释了为什么person_sname = 'O\\\'Brien'是真的。

其次,\字符在MySQL语法中有两个用法:

  1. 这是用于撰写escape sequences的字符:\n\t ......
  2. 这是在LIKE expressions中插入文字%_字符的默认转义字符:foo LIKE '%abc\%def%'
  3. 问题是在LIKE表达式中插入\符号会触发这两种行为,因此您实际上需要插入四个反斜杠来获取一个

    person_sname like 'O\\\\\'Brien'
    

    ...除非您使用ESCAPE子句更改第二个含义:

    person_sname like 'O\\\'Brien' escape '|'
    

    当然,如果数据没有损坏,你可以简单地说:

    person_sname = 'O\'Brien'
    person_sname like 'O\'Brien'
    

答案 1 :(得分:1)

\LIKE的默认ESCAPE字符,因此您需要再次转义它或定义不同的ESCAPE字符。

无论如何,我不会存储带有转义字符的名字。

SELECT 
        CASE WHEN name LIKE 'O\\\'Brien' THEN 1 ELSE 0 END,             /*0*/
        CASE WHEN name LIKE 'O\\\\\'Brien' THEN 1 ELSE 0 END,           /*1*/        
        CASE WHEN name LIKE 'O\\\'Brien' ESCAPE '~' THEN 1 ELSE 0 END,  /*1*/
        CASE WHEN name = 'O\\\'Brien' THEN 1 ELSE 0 END                 /*1*/
FROM
(SELECT 'O\\\'Brien' as name) T

答案 2 :(得分:1)

这在大多数SQL方言中非常标准:

SELECT person_sname
FROM people
WHERE person_sname like 'O''Brien' -- same as = 'O''Brien'

SELECT person_sname
FROM people
WHERE person_sname like 'O''Brien%' -- O'Brien plus more stuff

SELECT person_sname
FROM people
WHERE person_sname like 'O''%' -- O'plus more stuff

请注意,如果ANSI_QUOTES已启用,则不能使用“for strings”,因为“”用于标识符。

答案 3 :(得分:0)

like "O'%"就足够了。你这里不需要任何反斜杠。