Caractère de guillemet simple d'échappement à utiliser dans une requête SQLite

179

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:

$ 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 un guillemet simple. J'ai également essayé de double échapper le guillemet simple (en utilisant \\\'au lieu de \'), mais cela n'a pas fonctionné non plus. Qu'est-ce que je fais mal?

jpm
la source

Réponses:

293

Essayez de doubler les guillemets simples (de nombreuses bases de données l'attendent de cette façon), donc 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 plaçant la chaîne entre guillemets simples ('). Un guillemet simple dans la chaîne peut être encodé en mettant deux guillemets simples dans une ligne - comme dans Pascal. Les échappements de style C utilisant la barre oblique inverse ne sont pas pris en charge car ils ne sont pas du SQL standard. 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".

Ryan Guill
la source
8
Envisagez également d'utiliser des paramètres liés si le langage hôte les prend en charge (la plupart le font, mais pas le shell SQLite). Le SQL serait alors INSERT INTO table_name (field1, field2) VALUES (?, ?)et les valeurs seraient fournies directement (et sans substitutions).
Donal Fellows
1
Ne pouvons-nous pas simplement utiliser des guillemets doubles? comme: INSERT INTO nom_table (champ1, champ2) VALUES (123, "Hello there"); ?
JacksOnF1re
De plus, selon la durée de vie de la chaîne, la première étape peut être de convertir «» en »avant de les doubler à nouveau.
Gary Z du
44

Je crois que vous voudriez vous échapper en doublant le guillemet simple:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');
dépassé
la source
10

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

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

exemple:

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

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. 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 en c # et java

Charlie D. Eupeña
la source
0

En C #, vous pouvez utiliser ce qui suit pour remplacer le guillemet simple par un guillemet double:

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

Et la sortie sera:

"St. Mary''s"

Et, si vous travaillez directement avec Sqlite; vous pouvez travailler avec un objet au lieu de la chaîne 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("'", "''");
}
sorbier
la source
0

Dans les scripts bash, j'ai trouvé que l'échappement de guillemets doubles autour de la valeur était nécessaire pour les valeurs pouvant être nulles ou contenant des caractères nécessitant une échappement (comme des tirets).

Dans cet exemple, la valeur de columnA peut être nulle ou contenir des traits d'union:

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