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

実行後、colname (type: text)に$${a{e^i\pi}a}$$を持つ新しい行 int tablename が存在するはずです。しかし、私が得るのは$${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 - SQL インジェクションを防止するためのエスケープ文字列

于 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 に答える