2009-03-02 10 views
123

Ich schrieb das Datenbankschema (bisher nur eine Tabelle) und die INSERT-Anweisungen für diese Tabelle in einer Datei. Dann habe ich die Datenbank wie folgt:Escape-Anführungszeichen zur Verwendung in einer SQLite-Abfrage

$ 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 

Linie 16 meiner Datei etwa wie folgt aussieht:

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

Das Problem der Escape-Zeichen für ein Apostroph ist. Ich habe auch versucht, doppelt das einfache Zitat zu entkommen (mit \\\' anstelle von \'), aber das hat auch nicht funktioniert. Was mache ich falsch?

Antwort

213

Versuchen Sie, die Sie (viele Datenbanken es erwarten, dass Art und Weise), so wäre es verdoppeln:

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

Relevante Zitat von the documentation: durch Einschließen der

Eine String-Konstante gebildet Zeichenfolge in Anführungszeichen ('). Ein einzelnes Anführungszeichen in der Zeichenfolge kann codiert werden, indem zwei einfache Anführungszeichen in einer Zeile gesetzt werden - wie in Pascal. C-Style Escapes mit dem Backslash-Zeichen werden nicht unterstützt, da sie kein Standard-SQL sind. BLOB-Literale sind String-Literale, die hexadezimale Daten enthalten und denen ein einzelnes "x" - oder "X" -Zeichen vorangestellt ist. ... Ein Literalwert kann auch das Token "NULL" sein.

+5

Bedenken Sie außerdem, gebunden mit Parameter, wenn die Host-Sprache sie unterstützt (die meisten tun dies, aber die SQLite-Shell nicht). Die SQL wäre dann 'INSERT INTO Tabellenname (field1, field2) VALUES (?,?)' Und die Werte würden direkt (und ohne Ersetzungen) geliefert werden. –

38

Ich glaube, Sie würden den Apostroph entfliehen wollen durch eine Verdoppelung:

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

In C# Sie Folgendes verwenden können, das Apostroph mit einem doppelten Anführungszeichen zu ersetzen:

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

Und der Ausgang wird sein:

"St. Mary''s" 

Und wenn Sie worki sind ng mit Sqlite direkt; Sie können anstelle von String mit dem Objekt arbeiten und spezielle Dinge wie DBNull fangen:

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

Nur für den Fall, wenn Sie eine Schleife oder eine JSON-Zeichenfolge, die in der Datenbank einfügen 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 für mich in C# und Java

0

für alle (') in der Zeichenfolge ersetzen,

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

Beispiel verwenden:

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