2009-03-02 17 views
123

Napisałem schemat bazy danych (tylko jedna tabela do tej pory), a instrukcje INSERT dla tej tabeli w jednym pliku. Potem stworzył bazę danych w następujący sposób:Escape pojedynczy cudzysłów do użycia w zapytaniu 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 

Linia 16 od mojego pliku wygląda mniej więcej tak:

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

Problemem jest znakiem ucieczki dla jednego cytatu. Próbowałem również podwójne unikanie pojedynczego cytatu (przy użyciu \\\' zamiast \'), ale to też nie działa. Co ja robię źle?

Odpowiedz

213

Spróbuj podwojenie się po apostrofów (wiele baz danych można oczekiwać, że w ten sposób), więc byłoby:

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

Stosowna cytat z the documentation:

Ciąg stały jest utworzona przez otaczający ciąg w pojedynczych cudzysłowach ('). Pojedynczy cudzysłów w ciągu może być zakodowany poprzez umieszczenie dwóch pojedynczych cudzysłowów z rzędu - jak w Pascalu. Znaki w stylu C za pomocą znaku ukośnika odwrotnego nie są obsługiwane, ponieważ nie są standardowym językiem SQL. Literały BLOB to literały ciągów zawierające dane szesnastkowe i poprzedzone pojedynczym znakiem "X" lub "X". ... Wartość dosłowną może również oznaczać "NULL".

+5

Ponadto, należy rozważyć użycie bound parametry, jeśli obsługuje je język hosta (większość z nich, ale powłoka SQLite nie). SQL byłby wówczas "INSERT INTO nazwa_tabeli (pole1, pole2) WARTOŚCI (?,?)", A wartości byłyby dostarczane bezpośrednio (i bez podstawień). –

38

wierzę, że chcesz uciec przez podwojenie jeden cytat:

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

W języku C# można użyć następujących czynności, aby zastąpić jeden cytat z podwójnym Cytat:

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

a wyjście będzie:

"St. Mary''s" 

A jeśli są worki ng z Sqlite bezpośrednio; można pracować z obiektu zamiast sznurka i złapać specjalne rzeczy jak DBNull:

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

Tylko w przypadku, jeśli masz pętlę lub ciąg json, że potrzebujesz wstawić w bazie danych. Spróbuj zastąpić ciąg pojedynczym cudzysłowem. tutaj jest moje rozwiązanie. przykład, jeśli masz ciąg zawierający jeden cytat.

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

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

to działa na mnie w C# i Java

0

do zastąpienia wszystko (') w ciągu, użyć

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

przykład:

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