例如:
select * from tablename where fields like "%string "hi" %";
错误:
您的SQL语法有误。检查与您的MySQL服务器版本相对应的手册,以在第1行的“ hi”“”附近使用正确的语法
如何建立此查询?
Answers:
此答案中提供的信息可能会导致编程实践不安全。
此处提供的信息高度依赖于MySQL配置,包括(但不限于)程序版本,数据库客户端和使用的字符编码。
参见http://dev.mysql.com/doc/refman/5.0/en/string-literals.html
MySQL识别以下转义序列。 \ 0 ASCII NUL(0x00)字符。 \'单引号(“'”)字符。 \“双引号(”“”)字符。 \ b退格字符。 \ n换行符(换行符)。 \ r回车符。 \ t制表符。 \ Z ASCII 26(Control-Z)。请参阅表格后面的注释。 \\反斜杠(“ \”)字符。 \% 一个人物。请参阅表格后面的注释。 \_ 一个人物。请参阅表格后面的注释。
所以你需要
select * from tablename where fields like "%string \"hi\" %";
尽管正如Bill Karwin在下面指出的那样,对字符串定界符使用双引号不是标准的SQL,所以使用单引号是一个好习惯。这简化了事情:
select * from tablename where fields like '%string "hi" %';
我已经用Java开发了自己的MySQL转义方法(如果对任何人有用)。
请参阅下面的类代码。
警告:如果启用了NO_BACKSLASH_ESCAPES SQL模式,则错误。
private static final HashMap<String,String> sqlTokens;
private static Pattern sqlTokenPattern;
static
{
//MySQL escape sequences: http://dev.mysql.com/doc/refman/5.1/en/string-syntax.html
String[][] search_regex_replacement = new String[][]
{
//search string search regex sql replacement regex
{ "\u0000" , "\\x00" , "\\\\0" },
{ "'" , "'" , "\\\\'" },
{ "\"" , "\"" , "\\\\\"" },
{ "\b" , "\\x08" , "\\\\b" },
{ "\n" , "\\n" , "\\\\n" },
{ "\r" , "\\r" , "\\\\r" },
{ "\t" , "\\t" , "\\\\t" },
{ "\u001A" , "\\x1A" , "\\\\Z" },
{ "\\" , "\\\\" , "\\\\\\\\" }
};
sqlTokens = new HashMap<String,String>();
String patternStr = "";
for (String[] srr : search_regex_replacement)
{
sqlTokens.put(srr[0], srr[2]);
patternStr += (patternStr.isEmpty() ? "" : "|") + srr[1];
}
sqlTokenPattern = Pattern.compile('(' + patternStr + ')');
}
public static String escape(String s)
{
Matcher matcher = sqlTokenPattern.matcher(s);
StringBuffer sb = new StringBuffer();
while(matcher.find())
{
matcher.appendReplacement(sb, sqlTokens.get(matcher.group(1)));
}
matcher.appendTail(sb);
return sb.toString();
}
您应将单引号用于字符串定界符。单引号是标准的SQL字符串定界符,双引号是标识符定界符(因此,您可以在表或列的名称中使用特殊的单词或字符)。
在MySQL中,默认情况下,双引号(非标准地)用作字符串定界符(除非您设置了ANSI
SQL模式)。如果您使用其他品牌的SQL数据库,则养成按标准使用引号的习惯,将会从中受益。
使用单引号的另一个方便好处是,字符串中的文字双引号不需要转义:
select * from tablename where fields like '%string "hi" %';
MySQL具有字符串函数QUOTE,它应该解决此问题:
LIKE
的%
性格,所以就没什么用了
QUOTE
会为字符串值添加周围的单个qoutes
您可以使用mysql_real_escape_string。mysql_real_escape_string()
不会转义%
和_
,因此您应该分别转义MySQL通配符(%
和_
)。
对于这样的字符串,对我来说,最舒适的方法是将'或“加倍,如MySQL手册中所述:
有几种在字符串中包含引号字符的方法:
A “'” inside a string quoted with “'” may be written as “''”. A “"” inside a string quoted with “"” may be written as “""”. Precede the quote character by an escape character (“\”). A “'” inside a string quoted with “"” needs no special treatment and need not be doubled or escaped. In the same way, “"” inside a
用“'”引号的字符串不需要特殊处理。
它来自http://dev.mysql.com/doc/refman/5.0/en/string-literals.html。
为了测试如何使用终端在MySQL中插入双引号,可以使用以下方式:
TableName(Name,DString)->将模式
插入TableName值(“名称”,“我的QQDoubleQuotedStringQQ”)
插入值之后,可以用双引号或单引号更新数据库中的值:
update table TableName replace(Dstring, "QQ", "\"")