【问题标题】:Braces become deleted in escaped SQL statement大括号在转义的 SQL 语句中被删除
【发布时间】:2013-02-01 14:33:53
【问题描述】:

下面的说法有什么问题?

        String sql = "INSERT INTO tablename (colname) VALUES ($tag$$${a{e^i\\pi}a}$$$tag$);";
        Connection connection = DB.getConnection();
        Statement st = connection.createStatement();       
        st.executeQuery(sql);

执行后,应该有一个新的row int tablename,在colname(类型:文本)中有$${a{e^i\pi}a}$$。但我得到的只是 $${ae^i\pia}$$,这是没有大括号的预期。

我在 Windows 7 机器上使用 Java 7.11、PostgreSQL 9.1 (x64) 对其进行了测试。

【问题讨论】:

    标签: java sql postgresql escaping


    【解决方案1】:

    只需使用准备好的语句,这样就不会出现未转义字符串的错误,因为 SQL 会自动为您完成。

      st = conn.prepareStatement("INSERT INTO tablename (colname) VALUES (?)");
      st.setString(1, "$${a{e^i\\pi}a}$$");
      st.executeUpdate();
    

    有关其他信息,您可以查看此问题的答案: Java - escape string to prevent SQL injection

    【讨论】:

      【解决方案2】:

      这是由驱动程序的 JDBC 转义引起的,例如支持{call ...}{fn ...} 语法。

      根据这个帖子:

      http://postgresql.1045698.n5.nabble.com/plpgsql-function-comment-with-single-quote-braces-td5155934.html

      你需要调用statement.setEscapeProcessing(false)来防止驱动解析JDBC转义语法。

      请注意,这只发生在使用美元报价时。 “常规”单引号内的字符串文字不受 JDBC 转义的影响(就像 PreparedStatements 的值一样)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-02
        • 1970-01-01
        • 2016-12-04
        • 2010-09-14
        • 1970-01-01
        • 2019-07-11
        相关资源
        最近更新 更多