首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何转义MySQL中的特殊字符?

如何转义MySQL中的特殊字符?
EN

Stack Overflow用户
提问于 2009-05-19 14:12:31
回答 7查看 448K关注 0票数 90

例如:

代码语言:javascript
复制
select * from tablename where fields like "%string "hi"  %";

错误:

您的SQL语法中有一个错误;请查看与您的MySQL服务器版本对应的手册,了解要在第1行的'hi“”附近使用的正确语法。

如何构建此查询?

EN

回答 7

Stack Overflow用户

发布于 2011-06-25 23:11:33

我已经用Java语言开发了自己的MySQL转义方法(如果对任何人都有用的话)。

请参阅下面的类代码。

警告:如果启用了NO_BACKSLASH_ESCAPES SQL模式,则错误。

代码语言:javascript
复制
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();
}
票数 38
EN

Stack Overflow用户

发布于 2009-05-19 06:34:12

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

在MySQL中,默认情况下,双引号(非标准的)作为字符串分隔符工作(除非您设置了ANSI SQL模式)。如果您曾经使用其他品牌的SQL数据库,您将从养成标准使用引号的习惯中受益。

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

代码语言:javascript
复制
select * from tablename where fields like '%string "hi" %';
票数 27
EN

Stack Overflow用户

发布于 2013-11-09 22:08:44

MySQL有字符串函数QUOTE,应该可以解决这个问题:

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/881194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档