如何自动转义mysql文本块中的字符

时间:2012-01-06 00:26:30

标签: java mysql

我正在使用Java应用程序通过文本文件读取并将它们输出到SQL脚本并最终输出到Mysql数据库。其中一列由几行无格式文本组成,包括逗号和撇号等符号。为了使事情变得更加困难,我故意添加新行以保持文本的可读性。有没有办法让MySQL忽略会导致问题的字符组合(主要是撇号,但我知道如何知道这些文本块将包含哪些内容)而不会破坏换行符?

3 个答案:

答案 0 :(得分:1)

你必须最初添加转义斜杠:\ 所以就像它的实际单引号一样。放入内容时,您可以使用PHP将add_slash()放入数据库中的字符串中,并自动为它们转义。

答案 1 :(得分:0)

通读:http://dev.mysql.com/doc/refman/5.1/en/string-literals.html

简而言之,这些是要替换的字符

\0  An ASCII NUL (0x00) character.
\'  A single quote (“'”) character.
\"  A double quote (“"”) character.
\b  A backspace character.
\n  A newline (linefeed) character.
\r  A carriage return character.
\t  A tab character.
\Z  ASCII 26 (Control+Z). See note following the table.
\\  A backslash (“\”) character.
\%  A “%” character. See note following the table.
\_  A “_” character. See note following the table.

这是我在一些Java程序中使用了一段时间,我不能/不使用参数绑定。

public static String addSlashesSearchMode(String s) {
    return addSlashes(s, true);
}

public static String addSlashes(String s) {
    return addSlashes(s, false);
}

private static String addSlashes(String s, boolean search) {
    if (s == null) {
        return s;
    }
    String[][] chars;
    if(!search) {
        chars = new String[][ ]{
                {"\\",  "\\\\"},
                {"\0", "\\0"},
                {"'", "\\'"}, 
                {"\"",  "\\\""},
                {"\b",  "\\b"},
                {"\n",  "\\n"},
                {"\r",  "\\r"},
                {"\t",  "\\t"},
                {"\\Z", "\\\\Z"}, // not sure about this one
                {"%", "\\%"},     // used in searching
                {"_", "\\_"}
        };
    } else {
        chars = new String[][ ]{
                {"\\",  "\\\\"},
                {"\0", "\\0"},
                {"'", "\\'"}, 
                {"\"",  "\\\""},
                {"\b",  "\\b"},
                {"\n",  "\\n"},
                {"\r",  "\\r"},
                {"\t",  "\\t"},
                {"\\Z", "\\\\Z"}, // not sure about this one
        };
    }
    for (String[] c : chars) {
        s = s.replace(c[0], c[1]);
    }
    return s;
}

用法StringUtils.addSlashes("ke\rn\tny's\"\nnew li\\ne%"))

输出ke\rn\tny\'s\"\nnew li\\ne\%

在phpmyadmin中查看

输出

ke
n    ny's"
new li\ne\%

注意:我对\Z实施不太确定,也许有人可以详细说明。

答案 2 :(得分:0)

我知道你想输出一个SQL脚本,但总的来说我认为直接访问数据库并让驱动程序为你转义文本要好得多。

SQL:更新myTable set value1 =?其中value2 =?

然后在代码中创建一个PreparedStatement并调用setParameter(1,value1)等。

驱动程序将负责转义撇号和其他特殊字符。