Bir SQLite sorgusunda kullanmak için tek tırnak karakteri kaçış


180

Veritabanı şemasını (şu ana kadar yalnızca bir tablo) ve bu tablo için INSERT deyimlerini tek bir dosyada yazdım. Sonra veritabanını aşağıdaki gibi oluşturdum:

$ 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

Dosyamın 16 satırı şuna benzer:

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

Sorun tek bir alıntı için kaçış karakteri. Ben de ( \\\'yerine kullanarak \') tek teklif kaçan çift çalıştı , ama bu da işe yaramadı. Neyi yanlış yapıyorum?

Yanıtlar:


294

Tek tırnakları ikiye katlamayı deneyin (birçok veritabanı bu şekilde bekler), bu yüzden:

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

Belgelerden ilgili alıntı :

Bir dize sabiti, dizeyi tek tırnak (') içine alarak oluşturulur. Dize içindeki tek bir alıntı, Pascal'da olduğu gibi arka arkaya iki tek tırnak koyarak kodlanabilir. Ters eğik çizgi karakteri kullanan C stili kaçışlar standart SQL olmadığı için desteklenmez. BLOB değişmez değerleri, onaltılık veriler içeren ve önünde tek bir "x" veya "X" karakteri bulunan dize değişmezleridir. ... Değişmez değer de "NULL" belirteci olabilir.


8
Ayrıca, ana bilgisayar dili bunları destekliyorsa bağlı parametreleri kullanmayı düşünün (çoğu bunu yapar, ancak SQLite kabuğu desteklemez). SQL daha sonra olacaktır INSERT INTO table_name (field1, field2) VALUES (?, ?)ve değerler doğrudan (ve ikame olmadan) sağlanacaktır.
Donal Fellows

1
Sadece çift tırnak kullanamaz mıyız? gibi: tablo_adı (alan1, alan2) DEĞERLERİNE EKLE (123, "Merhaba, var"); ?
JacksOnF1re

Ayrıca, dizenin ömrüne bağlı olarak, ilk adım, onları iki katına çıkarmadan önce '' değerini '' dönüştürmek olabilir.
Gary Z

44

Tek alıntıyı ikiye katlayarak kaçmak isteyeceğine inanıyorum:

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

10

dizenizdeki tümünü (') değiştirmek için şunu kullanın:

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

misal:

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

6

Sadece bir döngü veya veritabanına eklemek için bir json dizesi varsa. Dizeyi tek bir tırnak işareti ile değiştirmeyi deneyin. işte benim çözümüm. Örneğin, tek bir alıntı içeren bir dizeniz varsa.

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

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

Bu benim için c # ve java çalışır


0

C # 'da tek alıntıyı çift tırnak ile değiştirmek için aşağıdakileri kullanabilirsiniz:

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

Ve çıktı:

"St. Mary''s"

Ve eğer doğrudan Sqlite ile çalışıyorsanız; dize yerine nesne ile çalışabilir ve DBNull gibi özel şeyleri yakalayabilirsiniz:

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

0

Bash komut dosyalarında, değer etrafında çift tırnak işareti kaçmanın, boş olabilen veya kaçmayı gerektiren karakterler (tire gibi) içerebilen değerler için gerekli olduğunu buldum.

Bu örnekte, columnA'nın değeri null olabilir veya tire içerebilir:

sqlite3 $db_name "insert into foo values (\"$columnA\", $columnB)";
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.