Escapezeichen in einfachen Anführungszeichen zur Verwendung in einer SQLite-Abfrage

179

Ich habe das Datenbankschema (bisher nur eine Tabelle) und die INSERT-Anweisungen für diese Tabelle in einer Datei geschrieben. Dann habe ich die Datenbank wie folgt erstellt:

$ sqlite3 newdatabase.db
SQLite version 3.4.0
Enter ".help" for instructions
sqlite> .read ./schema.sql
SQL error near line 16: near "s": syntax error

Zeile 16 meiner Datei sieht ungefähr so ​​aus:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there\'s');

Das Problem ist das Escape-Zeichen für ein einfaches Anführungszeichen. Ich habe auch versucht, dem einfachen Anführungszeichen doppelt zu entkommen ( \\\'anstelle von \'), aber das hat auch nicht funktioniert. Was mache ich falsch?

jpm
quelle

Antworten:

293

Versuchen Sie, die einfachen Anführungszeichen zu verdoppeln (viele Datenbanken erwarten dies so), also wäre es:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');

Relevantes Zitat aus der Dokumentation :

Eine Zeichenfolgenkonstante wird gebildet, indem die Zeichenfolge in einfache Anführungszeichen (') eingeschlossen wird. Ein einfaches Anführungszeichen innerhalb der Zeichenfolge kann codiert werden, indem zwei einfache Anführungszeichen hintereinander gesetzt werden - wie in Pascal. Escapezeichen im C-Stil mit dem Backslash-Zeichen werden nicht unterstützt, da es sich nicht um Standard-SQL handelt. BLOB-Literale sind Zeichenfolgenliterale, die hexadezimale Daten enthalten und denen ein einzelnes "x" - oder "X" -Zeichen vorangestellt ist. ... Ein Literalwert kann auch das Token "NULL" sein.

Ryan Guill
quelle
8
Erwägen Sie auch die Verwendung gebundener Parameter, wenn die Hostsprache diese unterstützt (die meisten tun dies, die SQLite-Shell jedoch nicht). Das SQL wäre dann INSERT INTO table_name (field1, field2) VALUES (?, ?)und die Werte würden direkt (und ohne Substitutionen) geliefert.
Donal Fellows
1
Können wir nicht einfach doppelte Anführungszeichen verwenden? wie: INSERT INTO Tabellenname (Feld1, Feld2) VALUES (123, "Hallo, es gibt"); ?
JacksOnF1re
Abhängig von der Lebensdauer der Zeichenfolge besteht der erste Schritt möglicherweise darin, '' in 'zu konvertieren, bevor sie erneut verdoppelt werden.
Gary Z
44

Ich glaube, Sie möchten entkommen, indem Sie das einfache Zitat verdoppeln:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');
überschwemmt
quelle
10

Verwenden Sie zum Ersetzen aller (') in Ihrer Zeichenfolge

.replace(/\'/g,"''")

Beispiel:

sample = "St. Mary's and St. John's";
escapedSample = sample.replace(/\'/g,"''")
M.Fahri
quelle
6

Nur für den Fall, dass Sie eine Schleife oder einen JSON-String haben, die in die Datenbank eingefügt werden müssen. Versuchen Sie, die Zeichenfolge durch ein einfaches Anführungszeichen zu ersetzen. Hier ist meine Lösung. Beispiel, wenn Sie eine Zeichenfolge haben, die ein einfaches Anführungszeichen enthält.

String mystring = "Sample's";
String myfinalstring = mystring.replace("'","''");

 String query = "INSERT INTO "+table name+" ("+field1+") values ('"+myfinalstring+"')";

Das funktioniert bei mir in c # und java

Charlie D. Eupeña
quelle
0

In C # können Sie Folgendes verwenden, um das einfache Anführungszeichen durch ein doppeltes Anführungszeichen zu ersetzen:

 string sample = "St. Mary's";
 string escapedSample = sample.Replace("'", "''");

Und die Ausgabe wird sein:

"St. Mary''s"

Und wenn Sie direkt mit Sqlite arbeiten; Sie können mit Objekt anstelle von Zeichenfolge arbeiten und spezielle Dinge wie DBNull abfangen:

private static string MySqlEscape(Object usString)
{
    if (usString is DBNull)
    {
        return "";
    }
    string sample = Convert.ToString(usString);
    return sample.Replace("'", "''");
}
Sapbucket
quelle
0

In Bash-Skripten stellte ich fest, dass das Umschließen von doppelten Anführungszeichen um den Wert für Werte erforderlich ist, die null sein können oder Zeichen enthalten, die umgangen werden müssen (wie Bindestriche).

In diesem Beispiel kann der Wert von columnA null sein oder Bindestriche enthalten:

sqlite3 $db_name "insert into foo values (\"$columnA\", $columnB)";
Dan Tanner
quelle