Keluar dari karakter kutipan tunggal untuk digunakan dalam kueri SQLite

179

Saya menulis skema database (hanya satu tabel sejauh ini), dan pernyataan INSERT untuk tabel itu dalam satu file. Kemudian saya membuat database sebagai berikut:

$ 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

Baris 16 file saya terlihat seperti ini:

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

Masalahnya adalah karakter melarikan diri untuk satu kutipan. Saya juga mencoba dua kali lolos dari kutipan tunggal (menggunakan \\\'bukan \'), tetapi itu tidak berhasil. Apa yang saya lakukan salah?

jpm
sumber

Jawaban:

293

Coba gandakan tanda kutip tunggal (banyak database berharap seperti itu), jadi itu akan menjadi:

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

Kutipan yang relevan dari dokumentasi :

Konstanta string terbentuk dengan melampirkan string dalam tanda kutip tunggal ('). Kutipan tunggal dalam string dapat dikodekan dengan menempatkan dua tanda kutip tunggal berturut-turut - seperti dalam Pascal. C-style lolos menggunakan karakter backslash tidak didukung karena mereka bukan SQL standar. BLOB literals adalah literal string yang berisi data heksadesimal dan didahului oleh satu karakter "x" atau "X". ... Nilai literal juga bisa menjadi token "NULL".

Ryan Guill
sumber
8
Juga, pertimbangkan untuk menggunakan parameter terikat jika bahasa host mendukungnya (sebagian besar melakukannya, tetapi shell SQLite tidak). SQL akan menjadi INSERT INTO table_name (field1, field2) VALUES (?, ?)dan nilai-nilai akan diberikan secara langsung (dan tanpa substitusi).
Donal Fellows
1
Tidak bisakah kita menggunakan tanda kutip ganda? seperti: INSERT INTO table_name (field1, field2) VALUES (123, "Hello there"); ?
JacksOnF1re
Juga, tergantung pada masa pakai string, langkah pertama mungkin mengonversi '' ke 'sebelum menggandakannya kembali.
Gary Z
44

Saya yakin Anda ingin melarikan diri dengan menggandakan kutipan tunggal:

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

untuk mengganti semua (') di string Anda, gunakan

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

contoh:

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

Untuk jaga-jaga jika Anda memiliki loop atau string json yang perlu dimasukkan dalam database. Cobalah untuk mengganti string dengan kutipan tunggal. ini solusinya. contoh jika Anda memiliki string yang berisi satu kutipan.

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

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

ini bekerja untuk saya di c # dan java

Charlie D. Eupeña
sumber
0

Dalam C # Anda dapat menggunakan yang berikut untuk mengganti penawaran tunggal dengan penawaran ganda:

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

Dan hasilnya adalah:

"St. Mary''s"

Dan, jika Anda bekerja dengan Sqlite secara langsung; Anda dapat bekerja dengan objek bukannya string dan menangkap hal-hal khusus seperti DBNull:

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

Dalam skrip bash, saya menemukan bahwa melarikan diri dari tanda kutip ganda di sekitar nilai diperlukan untuk nilai yang bisa berupa karakter nol atau berisi yang memerlukan pelarian (seperti tanda hubung).

Dalam contoh ini, nilai kolomA bisa menjadi nol atau mengandung tanda hubung .:

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