我如何在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”,“\”“)