1

のようなクエリがあるとしますSELECT * FROM my_table where name = 'Debbie O'Brian'。ご存知かもしれませんが、SQL Server では、'一重引用符を無視するために別のものを配置する必要があります。これが私が自動的にやりたいことです。

簡単に言えば、すべての出現箇所を 2 つの囲みの間'で置き換える必要があります。これが私がこれまでに持っているものです:'''

String text = "SELECT * FROM my_table where name = 'Debbie O'Brian'";
String[] splitArray = text.split(" '");
for (int i = 0; i < splitArray.length; i++) {
    String str = splitArray[i];
    if (str.endsWith("'"))
        str = str + " ";

    // replace all single quotes
    str = str.replace("'", "''");

    // revert last replacement
    str = str.replace("'' ", "' ");

    splitArray[i] = str;
}

StringBuilder builder = new StringBuilder();
for (int i = 0; i < splitArray.length; i++) {
    builder.append(splitArray[i]).append(" '");
}
System.out.println(builder.substring(0, builder.length() - 2).toString());

問題は、開始前に空白の存在に依存していることです'。私の質問は、この前提条件なしでこれを行うにはどうすればよいかということです。どんな助けでも(アルゴリズムの提案でも)大歓迎です。クエリには単一引用符で囲まれた文字列が複数ある場合があることに注意してください。

編集: Hibernate を使用してネイティブ SQL を実行し、SQL クエリ全体を入力として取得しています。

4

4 に答える 4

4

SQL クエリで単一引用符やその他の特殊文字を処理する最善の方法は、パラメータ化されたクエリを使用することです。また、より安全です。「SQL インジェクション」で検索することをお勧めします。これにより、クエリ内の一重引用符を保護して処理する方法がわかります。

于 2013-08-30T03:27:58.953 に答える
4

JDBC を使用する場合

PreparedStatement ps = conn.prepareStatement("SELECT * FROM my_table where name = ?")
ps.setString(1, name);
于 2013-08-30T03:28:02.130 に答える
0

上で述べたように、私の問題は SQL インジェクションではありませんでした。私が望んでいたことは、この時点で、要件に対して明らかに多すぎるSQLパーサーを実装しない限り、不可能のようです。したがって、2 人がコメントで述べたように、私は前提条件に固執し、間違った入力を修正しようとすることをあきらめます。

皆さんの回答に感謝します。

于 2013-09-01T23:58:08.217 に答える