2009-03-02 21 views
123

Ho scritto lo schema del database (solo una tabella fino ad ora) e le istruzioni INSERT per quella tabella in un file. Poi ho creato il database come segue:Escape carattere di virgoletta singola da utilizzare in una query 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 

Linea 16 del mio file sembra qualcosa di simile:

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

Il problema è il carattere di escape per una sola offerta. Ho anche provato a evadere doppiamente la citazione singola (utilizzando \\\' anziché \'), ma non ha funzionato neanche. Che cosa sto facendo di sbagliato?

risposta

213

Prova raddoppio le virgolette singole (molti database si aspettano in questo modo), quindi sarebbe:

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

citazione rilevante da the documentation:

Una stringa costante è formato racchiudendo il stringa tra virgolette singole ('). Una singola citazione all'interno della stringa può essere codificata inserendo due virgolette singole in una riga, come in Pascal. Gli escape in stile C che utilizzano il carattere backslash non sono supportati perché non sono standard SQL. I valori 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".

+5

Inoltre, considerare l'utilizzo legato parametri se la lingua host li supporta (la maggior parte lo fanno, ma la shell SQLite no). L'SQL sarebbe quindi 'INSERT INTO table_name (field1, field2) VALUES (?,?)' Ei valori sarebbero forniti direttamente (e senza sostituzioni). –

38

credo che ci si vuole sfuggire raddoppiando la sola offerta:

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

In C# è possibile utilizzare il seguente per sostituire il singolo apice con una doppia citazione:

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

E l'output sarà:

"St. Mary''s" 

E, se si lavora ng con Sqlite direttamente; è possibile lavorare con oggetto invece di corda e prendere le cose speciali come DBNull:

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

Solo nel caso in cui se si dispone di un ciclo o una stringa JSON che hanno bisogno di inserire nel database. Prova a sostituire la stringa con una sola citazione. ecco la mia soluzione. esempio se hai una stringa che contiene una singola citazione.

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

per sostituire tutti (') nella stringa, utilizzare

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

esempio:

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