我如何在MySQL中转义特殊字符?

例如:

select * from tablename where fields like "%string "hi" %"; 

错误:

你的SQL语法有错误, 检查对应于您的MySQL服务器版本的手册,在第1行的“hi”“”旁边使用正确的语法

我如何构build这个查询?

这个答案中提供的信息可能导致不安全的编程实践。

这里提供的信息在很大程度上取决于MySQLconfiguration,包括(但不限于)程序版本,数据库客户端和使用的字符编码。

请参阅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在下面指出的那样 ,但对于string分隔符使用双引号并不是标准的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(); } 

您应该使用单引号string分隔符。 单引号是标准的SQLstring分隔符,双引号是标识符分隔符(因此您可以在表或列的名称中使用特殊的单词或字符)。

在MySQL中,默认情况下双引号(非标准)作为string分隔符工作(除非您设置ANSI SQL模式)。 如果您曾经使用过其他品牌的SQL数据库,那么您将习惯使用标准的报价习惯。

使用单引号的另一个方便的好处是string中的字面双引号字符不需要被转义:

 select * from tablename where fields like '%string "hi" %'; 

你可以使用mysql_real_escape_string 。 mysql_real_escape_string()不会转义%_ ,所以你应该分别转义MySQL通配符( %_ )。

MySQL有string函数QUOTE ,它应该解决这个问题:

对于这样的string,对我来说,最简单的方法是将“或”加倍,如MySQL手册中所解释的:

在string中包含引号字符有几种方法:

 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 

用“'”引用的string不需要特殊的处理。

它来自http://dev.mysql.com/doc/refman/5.0/en/string-literals.html

如果在string中search时使用了一个variables,那么mysql_real_escape_string()对你mysql_real_escape_string() 。 只是我的build议:

 $char = "and way's 'hihi'"; $myvar = mysql_real_escape_string($char); select * from tablename where fields like "%string $myvar %"; 

为了testing如何使用Terminal在MYSQL中插入双引号,可以使用下面的方法。

TableName(Name,DString) – >架构
插入到TableName值(“Name”,“我的QQDoubleQuotedStringQQ”)

在插入值后,您可以使用双引号或单引号更新数据库中的值

更新表TableNamereplace(Dstring,“QQ”,“\”“)