7 Stimmen

Java PreparedStatement mit zwei einfachen Anführungszeichen für leere String-Parameter

Ich verwende eine PreparedStatement mit Sql wie zum Beispiel:

String sql = "insert into foo (a,b,c) values (?,?,?)";
 ps = conn.prepareStatement(sql);

  ps.setString(psIndex++, a);
  ps.setString(psIndex++, b);
  ps.setString(psIndex++, c);

Wenn jedoch eine der Variablen eine leere Zeichenfolge ist, erhält die resultierende Anweisung zwei einfache Anführungszeichen. Wie in: VALUES ('foo','','') Dann erhalte ich eine Ausnahme, da zwei einfache Anführungszeichen eine Escape-Sequenz sind.

Ich kann nicht glauben, dass ich bei der Suche nichts dazu finden konnte, aber ich konnte es nicht. Was ist hier eigentlich los?

3voto

bluish Punkte 24479

Da der OP nicht tut, was @Adam in den Kommentaren vorgeschlagen hat, werde ich es tun. Es ist nützlich für zukünftige Leser. Danke an @user119179 für die Idee.

Es könnte sich um eine Fehler im JDBC-Treiber die wir verwenden. Der Anbieter des Treibers sollte wissen, dass '' ist eine Escape-Sequenz.

Tatsächlich scheint die Aktualisierung des Treibers den Fehler für den OP zu lösen.

2voto

RichardTheKiwi Punkte 102469

Wie in: VALUES ('foo','','') Dann erhalte ich eine Ausnahme, da zwei einfache Anführungszeichen eine Escape-Sequenz sind.

Hier liegt ein Missverständnis vor. Die beiden einfachen Anführungszeichen です die leere Zeichenkette. Es findet keine Escape-Sequenz statt. Es handelt sich nur dann um ein escapetes Anführungszeichen, wenn es in einem anderen einfachen Anführungszeichen steht. Wenn Sie eine Ausnahme erhalten, liegt das Problem wahrscheinlich woanders, z. B. bei einer Einschränkung der Spalte in der Datenbank.

Die Erklärung

insert into foo (a,b,c) values ('foo','','')

ist sehr gültiges SQL.

0voto

Subhajit Roy Punkte 111

@cyberkiwi ist korrekt. Es kann sein, dass Ihre Spalten keine Nullwerte akzeptieren. Welche Exception erhalten Sie? Wenn Sie einen Protokollbericht haben, teilen Sie ihn mit.

0voto

Ramesh Kumar Punkte 1

Einfaches Anführungszeichen ersetzen ' mit UNICODE \u2019 Wert. Für weitere Details klicken Sie auf diese url

0voto

Sabir Khan Punkte 9178

Sie haben Ihre Java-Ausnahme nicht mitgeteilt & das hätte bei der Formulierung einer präzisen Antwort geholfen.

Es gibt zwei Aspekte in Ihrem Programm - Java & DB Constraints.

Für Java ist Empty String "" (doppelte Anführungszeichen, nicht einfache Anführungszeichen). Solange Ihre Java-Referenzen - a , b & c diesen Wert haben, wenn der Wert leer ist, sehe ich kein Problem, soweit es um PreparedStatement betroffen ist. Sie müssen sich nicht um die Escape-Sequenz für einfache Anführungszeichen kümmern, wenn Sie PreparedStatement . Ich bin mir nicht sicher, warum Sie die Werte als ['foo','',''] sollte es sein ["foo","",""] .

Zweiter Aspekt: Ihre DB-Spalten a , b & c aufgrund von Beschränkungen keine leeren Werte zulässt, ist eine ganz andere Sache und kann nicht mit Java-Code gesteuert werden. Das DB-Tabellenschema muss geändert werden, um in diesem Fall Standardwerte zuzulassen.

Die Diskussion über die Escape-Sequenz für einzelne Anführungszeichen ist relevant, wenn jemand eine SQL-Abfrage vorbereitet, indem er direkt Werte an die Abfragezeichenfolge anhängt, z. B. , "insert into foo (a,b,c) values ('foo','','')"; oder eine WHERE Klausel mit a='foo' . Dieser Weg wird jedoch aufgrund von SQL-Injection-Schwachstellen nicht empfohlen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X