我有一个包含人名的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
(例如)。
答案 0 :(得分:3)
你正在注入一个字面反斜杠。这就足够了:
SELECT person_sname
FROM people
WHERE person_sname = 'O\'Brien'
测试:
SELECT 'O\\\'Brien', 'O\'Brien'
更新:已经有一个已接受的答案,所以我只想补充一些说明。
首先,我忽略了存储数据已损坏的事实。不用说,这解释了为什么person_sname = 'O\\\'Brien'
是真的。
其次,\
字符在MySQL语法中有两个用法:
\n
,\t
...... %
和_
字符的默认转义字符:foo LIKE '%abc\%def%'
问题是在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'%"
就足够了。你这里不需要任何反斜杠。