例如:
select * from tablename where fields like "%string "hi" %";
错误:
您的SQL语法中有一个错误;请查看与您的MySQL服务器版本对应的手册,了解要在第1行的'hi“”附近使用的正确语法。
如何构建此查询?
发布于 2011-06-25 23:11:33
我已经用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();
}
发布于 2009-05-19 06:34:12
字符串分隔符应使用单引号。单引号是标准的SQL字符串分隔符,双引号是标识符分隔符(因此可以在表或列的名称中使用特殊的单词或字符)。
在MySQL中,默认情况下,双引号(非标准的)作为字符串分隔符工作(除非您设置了ANSI
SQL模式)。如果您曾经使用其他品牌的SQL数据库,您将从养成标准使用引号的习惯中受益。
使用单引号的另一个方便的好处是,字符串中的文字双引号字符不需要转义:
select * from tablename where fields like '%string "hi" %';
发布于 2013-11-09 22:08:44
MySQL有字符串函数QUOTE,应该可以解决这个问题:
https://stackoverflow.com/questions/881194
复制相似问题