1

以下陈述有什么问题?

        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);

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

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

4

2 回答 2

2

只需使用准备好的语句,这样就不会出现未转义字符串的错误,因为 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

于 2013-02-01T14:39:43.100 回答
1

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

根据这个线程:

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

您需要调用statement.setEscapeProcessing(false)以防止驱动程序解析 JDBC 转义语法。

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

于 2013-02-01T14:46:05.967 回答