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?

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.


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

10

Verwenden Sie zum Ersetzen aller (') in Ihrer Zeichenfolge

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

Beispiel:

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

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


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("'", "''");
}

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)";
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.