web-dev-qa-db-fra.com

Caractère de guillemet simple à utiliser dans une requête SQLite

J'ai écrit le schéma de base de données (une seule table à ce jour) et les instructions INSERT pour cette table dans un fichier. Ensuite, j'ai créé la base de données comme suit:

$ 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

La ligne 16 de mon fichier ressemble à ceci:

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

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

156
jpm

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

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

Citation pertinente de la documentation :

Une constante de chaîne est formée en entourant la chaîne de guillemets simples ('). Un seul guillemet dans la chaîne peut être codé en mettant deux guillemets simples dans une ligne - comme en Pascal. Les échappements de style C utilisant le caractère barre oblique inversée ne sont pas pris en charge car ils ne sont pas du code SQL standard. Les littéraux BLOB sont des chaînes de caractères 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".

262
Ryan Guill

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

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

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

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

exemple:

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

Juste au cas où vous auriez une boucle ou une chaîne json à insérer dans la base de données. Essayez de remplacer la chaîne par un guillemet simple. voici ma solution. Par exemple, si vous avez une chaîne contenant un seul guillemet.

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

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

cela fonctionne pour moi en c # et Java

3
Charlie D. Eupeña

En C #, vous pouvez utiliser ce qui suit pour remplacer la citation simple par une citation double:

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

Et le résultat sera:

"St. Mary''s"

Et si vous travaillez directement avec SQLite; vous pouvez travailler avec object au lieu de string 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("'", "''");
}
0
sapbucket