如何转义SQL插入的单引号...当要插入的字符串在用户生成的变量中时

时间:2014-10-13 00:50:28

标签: java sql jdbc

我正在构建一个使用jdbc执行的insert命令。部分原因是连接用户生成的字符串......这一切都有效,直到用户使用这样的字符串:

a'bcd

String userString="a'bcd";
String insertTableSQL = "INSERT INTO myTable "
                            + "(insertColumn) " 
                            + "VALUES("
                                +"'"+userString+"'"
                                +")";

statement.executeUpdate(insertTableSQL);

3 个答案:

答案 0 :(得分:40)

您可以执行以下任一操作:

  1. 使用 PreparedStatement 类。 (推荐

    String userString="a'bcd";
    String myStatement = " INSERT INTO MYTABLE (INSERTCOLUMN) VALUES (?)";
    PreparedStatement statement= con.prepareStatement   (myStatement );
    statement.setString(1,userString);
    statement.executeUpdate();
    
  2. 逃避单引号。

    在SQL中,单引号将使用双引号进行转义。 ' - > ''

    String userString="a'bcd";
    String changedUserString = userString.replace("'","''");
            //changedUserString  = a''bcd
    String insertTableSQL = "INSERT INTO myTable (insertColumn) VALUES("
                            +" '"+changedUserString +"' )";
    

答案 1 :(得分:7)

您可以使用StringEscapeUtils库中的Apache Commons Lang。 使用它你可以转义html,xml, sql 等字符。为你的目的寻找方法escapeXXX。供参考:When i need to escape Html string?

注意:escapeSql已在Apache Commons Lang 3中删除(请参阅Migrating StringEscapeUtils.escapeSql from commons.lang引用https://commons.apache.org/proper/commons-lang/article3_0.html#StringEscapeUtils.escapeSql

例如:

String str = FileUtils.readFileToString(new File("input.txt"));
        String results = StringEscapeUtils.escapeHtml(str);
        System.out.println(results);

输入:

<sometext>
Here is some "Text" that I'd like to be "escaped" for HTML
& here is some Swedish: Tack. Vars?god.
</sometext>

输出:

&lt;sometext&gt;
Here is some &quot;Text&quot; that I'd like to be &quot;escaped&quot; for HTML
&amp; here is some Swedish: Tack. Vars&aring;god.
&lt;/sometext&gt;

答案 2 :(得分:1)

这是另一种选择:

使用专为此目的而设计的原生Android方法:

DatabaseUtils.sqlEscapeString(String)

以下是在线文档:

在我看来,使用这种方法的主要优点是自我记录,因为方法名称清晰。

String userString="a'bcd";
String insertTableSQL = "INSERT INTO myTable "
                            + "(insertColumn) " 
                            + "VALUES("
                                +"'"+DatabaseUtils.sqlEscapeString(userString)+"'"
                                +")";

statement.executeUpdate(insertTableSQL);