2

これが私のJavaJDBCコードです(たとえば、変更および簡略化されています)。

ps = connection.prepareStatement("SELECT a,b,c FROM mytable WHERE category ~ ?");
ps.setString(1, "my/super/category/abc(def");
                                      ^
                                      |
    +---------------------------------+
    |
//this character is problem
result = ps.executeQuery();

文字列に丸括弧があるため、機能しませんでした。

プリペアドステートメントで丸括弧をエスケープする方法は?

編集:私の答えに基づいて(以下を参照)私は質問に正解します。

4

3 に答える 3

3

自分で答えます-問題は「〜」(チルダマーク)にあります。

いくつかの精緻化の後、興味深い発見があります:

SQL コードが次の場合 (SQL コードの "equal" マークを参照):

ps = connection.prepareStatement("SELECT a,b,c FROM mytable WHERE category = ?");

エスケープは必要ありません。ただし、SQL コードが次の場合 (SQL コードの「チルダ」マークを参照):

ps = connection.prepareStatement("SELECT a,b,c FROM mytable WHERE category ~ ?");

特殊文字がある場合はエスケープする必要があります。この場合は「(」または「)」です。

ps.setString(1, "super/category/abc(def".replaceAll("\\(", "\\\\(")));

これは、パターン マッチング: PostgreSQL パターン マッチングが原因です。チルダ マークを使用すると、JDBC ドライバーは丸括弧が通常の文字 (私の場合のように) なのか、アイテムを 1 つの論理アイテムにグループ化するパターン マッチングのグループ化記号なのかがわからないためです。

于 2013-01-27T07:13:31.437 に答える
0

ここで丸括弧を一重引用符で囲むことでエスケープできます。

于 2013-01-26T16:03:44.647 に答える
0

問題は、括弧の前にエスケープ文字を設定する必要があったため、クエリが結果を返さなかったことだと思いました。

ps.setString(1, "my/super/category/abc\\(def");

SQL 構文では、文字列にエスケープ文字を含めることができます。Java では、文字列内の括弧をエスケープできません。

于 2013-01-26T16:19:53.377 に答える