2009-03-02 8 views
123

J'ai écrit le schéma de la base de données (une seule table jusqu'à présent) et les instructions INSERT pour cette table dans un fichier. Ensuite, j'ai créé la base de données comme suit:Caractère de guillemets simples d'échappement à utiliser dans une requête SQLite

$ 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 

Ligne 16 de mon dossier ressemble à ceci:

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

Le problème est le caractère d'échappement pour une seule citation. J'ai également essayé d'échapper deux fois la citation simple (en utilisant \\\' au lieu de \'), mais cela n'a pas fonctionné non plus. Qu'est-ce que je fais mal?

Répondre

213

Essayez de doubler les guillemets simples (de nombreuses bases de données attendent de cette façon), il serait:

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

citation pertinente de the documentation:

est formé une chaîne constante en enfermant la chaîne entre guillemets simples ('). Une seule citation dans la chaîne peut être codée en mettant deux guillemets simples dans une rangée - comme dans Pascal. Les échappements de style C utilisant le caractère barre oblique inverse ne sont pas pris en charge car ils ne sont pas standard SQL. Les littéraux BLOB sont des littéraux de chaîne contenant des données hexadécimales et précédés d'un seul caractère "x" ou "X". ... Une valeur littérale peut également être le jeton "NULL".

+5

Aussi, pensez à utiliser lié paramètres si le langage hôte les supporte (la plupart le font, mais pas le shell SQLite). Le SQL serait alors 'INSERT INTO nom_table (field1, field2) VALUES (?,?)' Et les valeurs seraient fournies directement (et sans substitutions). –

38

Je crois que vous voudriez échapper en doublant la seule citation:

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

En C#, vous pouvez utiliser ce qui suit pour remplacer le guillemet simple avec une double citation:

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

Et la sortie sera:

"St. Mary''s" 

Et, si vous êtes worki ng avec Sqlite directement; vous pouvez travailler avec un objet au lieu de ficelle et attraper des choses spéciales comme DBNull:

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

Juste au cas où si vous avez une boucle ou une chaîne JSON qui ont besoin d'insérer dans la base de données. Essayez de remplacer la chaîne avec une seule citation. voici ma solution. exemple si vous avez une chaîne qui contient un guillemet simple.

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

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

cela fonctionne pour moi C# et java

0

pour remplacer tous (') dans votre chaîne, utilisez

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

exemple:

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