Esci dal carattere di virgoletta singola da utilizzare in una query SQLite


179

Ho scritto lo schema del database (finora solo una tabella) e le istruzioni INSERT per quella tabella in un file. Quindi ho creato il database come segue:

$ 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 riga 16 del mio file è simile a questa:

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

Il problema è il carattere di escape per una singola citazione. Ho anche provato a sfuggire doppiamente alla singola citazione (usando \\\'invece di \'), ma non ha funzionato neanche. Che cosa sto facendo di sbagliato?

Risposte:


293

Prova a raddoppiare le virgolette singole (molti database lo prevedono in questo modo), quindi sarebbe:

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

Citazione pertinente dalla documentazione :

Una costante di stringa si forma racchiudendo la stringa tra virgolette singole ('). Una singola virgoletta all'interno della stringa può essere codificata inserendo due virgolette singole in una riga, come in Pascal. Gli escape di tipo C che utilizzano il carattere barra rovesciata non sono supportati perché non sono SQL standard. I letterali BLOB sono letterali stringa contenenti dati esadecimali e preceduti da un singolo carattere "x" o "X". ... Un valore letterale può anche essere il token "NULL".


8
Inoltre, considera l'utilizzo di parametri associati se la lingua host li supporta (la maggior parte lo fa, ma la shell SQLite no). L'SQL sarebbe quindi INSERT INTO table_name (field1, field2) VALUES (?, ?)e i valori sarebbero forniti direttamente (e senza sostituzioni).
Donal Fellows,

1
Non possiamo usare solo virgolette doppie? come: INSERT INTO table_name (field1, field2) VALUES (123, "Ciao c'è"); ?
JacksOnF1re

Inoltre, a seconda della durata della stringa, il primo passo potrebbe essere quello di convertire "" in "prima di raddoppiarli nuovamente.
Gary Z,

44

Credo che vorresti scappare raddoppiando la singola citazione:

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

10

per sostituire tutto (') nella stringa, utilizzare

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

esempio:

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

6

Nel caso in cui si abbia un ciclo o una stringa json che è necessario inserire nel database. Prova a sostituire la stringa con una singola virgoletta. ecco la mia soluzione. esempio se hai una stringa che contiene è una singola virgoletta.

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

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

questo funziona per me in c # e java


0

In C # è possibile utilizzare quanto segue per sostituire la virgoletta singola con una virgoletta doppia:

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

E l'output sarà:

"St. Mary''s"

E, se lavori direttamente con Sqlite; puoi lavorare con oggetto invece che con stringa e catturare cose speciali come DBNull:

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

0

Negli script bash, ho scoperto che l'escape tra virgolette doppie attorno al valore era necessaria per valori che potevano essere null o contenere caratteri che richiedono l'escaping (come trattini).

In questo esempio, il valore della colonna A potrebbe essere nullo o contenere trattini .:

sqlite3 $db_name "insert into foo values (\"$columnA\", $columnB)";
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.