Bagaimana cara memasukkan nilai yang berisi tanda kutip (kutipan tunggal)?

310

Apa sintaks SQL yang benar untuk memasukkan nilai dengan tanda kutip di dalamnya?

Insert into Person
  (First, Last)
Values
  'Joe',
  'O'Brien'

Saya terus mendapatkan kesalahan karena saya pikir tanda kutip setelah O adalah tag penutup untuk nilai.

leora
sumber
16
Harap konfirmasi bahwa Anda tidak membuka diri terhadap serangan injeksi SQL. Gunakan parameter jika memungkinkan.
Andrew
Bahasa skrip apa yang Anda gunakan? Ada fungsi dalam PHP, misalnya, untuk melakukan ini dengan benar untuk Anda.
philfreo
Setuju dengan Andrew di sini: Saya harap pertanyaan ini hanya tentang menjalankan SQL melalui klien SQL atau "browser permintaan" atau semacamnya dan tidak benar-benar berada di suatu tempat dalam kode produksi. Tidak menggunakan pernyataan parameter adalah kebodohan.
charstar
sebenarnya dalam kode .. jika saya memiliki permintaan parameter tidak akan saya harus melakukan hal yang sama?
leora
2
Negatif. Bergantung pada database dan driver yang Anda gunakan, isolasi parameter mungkin ditangani secara berbeda, tetapi parameter dalam pernyataan parameter tidak perlu melarikan diri. Lihat en.wikipedia.org/wiki/SQL_injection#Preventing_SQL_injection
charstar

Jawaban:

485

Escape the apostrophe (yaitu menggandakan karakter tanda kutip tunggal) di SQL Anda:

INSERT INTO Person
    (First, Last)
VALUES
    ('Joe', 'O''Brien')
              /\
          right here  

Hal yang sama berlaku untuk permintaan SELECT:

SELECT First, Last FROM Person WHERE Last = 'O''Brien'

Apostrof, atau kutipan tunggal, adalah karakter khusus dalam SQL yang menentukan awal dan akhir data string. Ini berarti bahwa untuk menggunakannya sebagai bagian dari data string literal Anda, Anda perlu escapekarakter khusus. Dengan satu kutipan, ini biasanya dilakukan dengan menggandakan penawaran Anda. (Dua karakter kutipan tunggal, bukan penawaran ganda, bukan penawaran tunggal.)

Catatan : Anda hanya perlu khawatir tentang masalah ini ketika Anda mengedit data secara manual melalui antarmuka SQL mentah karena menulis kueri di luar pengembangan dan pengujian harus jarang terjadi. Dalam kode ada teknik dan kerangka kerja (tergantung pada tumpukan Anda) yang mengurus melarikan diri karakter khusus, injeksi SQL , dll.

Paul Sasik
sumber
6
$ linkQuestion = str_replace ("'", "' '", $ linkQuestion); (astaga itu sulit dibaca!)
user462990
bagaimana jika datanya dimasukkan ke dalam Person (First, Last) Nilai 'Joe', 'Father's shop'.
vijesh
37

Anda hanya perlu menggandakan pada tanda kutip tunggal ...

insert into Person (First, Last)
values ('Joe', 'O''Brien')
Justin Niessner
sumber
21

Anda harus melarikan diri dari tanda kutip. Dalam T-SQL ini dengan tanda kutip ganda, jadi insertpernyataan Anda menjadi:

Insert into Person
(First, Last)
Values
'Joe', 'O''Brien'
David Hall
sumber
AFAIK Valuesharus dimasukkan dalam kurung kurawal (yang kemudian membuatnya menjadi jawaban yang sama dengan @JustinNiessner)
qwerty_so
15

Karena satu kutipan digunakan untuk menunjukkan awal dan akhir suatu string; Anda harus menghindarinya.

Jawaban singkatnya adalah dengan menggunakan dua tanda kutip tunggal - ''- agar database SQL menyimpan nilai sebagai '.

Lihat menggunakan REPLACE untuk membersihkan nilai yang masuk:

Anda ingin memeriksa '''', dan menggantinya jika ada dalam string dengan ''''''untuk menghindari kutipan tunggal.

OMG Ponies
sumber
3

Eduffy punya ide bagus . Dia baru saja mendapatkannya mundur dalam contoh kodenya. Baik dalam JavaScript atau dalam SQLite Anda dapat mengganti apostrof dengan simbol aksen.

Dia (secara tidak sengaja saya yakin) menempatkan simbol aksen sebagai pembatas untuk string alih-alih mengganti tanda kutip di O'Brian. Ini sebenarnya solusi yang sangat sederhana untuk kebanyakan kasus.

Robert Sherman
sumber
Solusi hebat dan jauh lebih sederhana dan nama belakang saya adalah O`Reilly!
PhillipOReilly
Anyways Disarankan untuk menggunakan karakter melarikan diri. Kebetulan :) sejak hari saya menggunakan keyboard. Saya menggunakan simbol aksen secara tidak sengaja menggantikan kutipan tunggal saat menulis dokumen. (Namun dalam kode saya menggunakan 'sebagai pengidentifikasi karakter). Sampai tahun lalu ketika seseorang memberi tahu saya kata sandinya dan saya tidak dapat masuk ke sistemnya. kami tidak tahu sampai jam berapa saya mengetik 'sebagai `.
Learner
3

Karakter apostrof dapat disisipkan dengan memanggil fungsi CHAR dengan nilai pencarian tabel ASCII apostrof , 39. Nilai string kemudian dapat digabungkan dengan operator gabungan .

Insert into Person
  (First, Last)
Values
  'Joe',
  concat('O',char(39),'Brien')
Nathan
sumber
2

Kutipan tunggal lolos dengan menggandakannya ,

SQL berikut menggambarkan fungsi ini.

declare @person TABLE (
    [First] nvarchar(200),
    [Last] nvarchar(200)
)

insert into @person 
    (First, Last)
values
    ('Joe', 'O''Brien')

select * from @person

Hasil

First   | Last
===================
Joe     | O'Brien
Max Pringle
sumber
0

gunakan tanda kutip ganda di sekitar nilai.

insert into Person (First, Last) Values("Joe","O'Brien")
run_time_error
sumber
3
Perhatikan bahwa ini bukan SQL standar lagi, meskipun saya tahu Informix, untuk menyebutkan satu DBMS, memungkinkannya. Anda juga harus membahas bagaimana Anda akan memasukkan string seperti He said, "Don't!"menggunakan tanda kutip tunggal dan / atau tanda kutip ganda - yang dapat dilakukan: 'He said, "Don''t!"'atau "He said, ""Don't!""". Saat menambahkan jawaban baru ke pertanyaan lama dengan jawaban yang diterima, Anda harus memberikan informasi baru dan lengkap. Menggunakan tanda kutip ganda adalah hal baru - tetapi terbatas pada beberapa DBMS; Anda harus bersusah payah mengidentifikasi setidaknya satu dari mereka yang menerimanya.
Jonathan Leffler
-1

Gunakan backtick (pada tombol ~) sebagai gantinya;

`O'Brien`
bengkak
sumber
1
Lalu masalahnya menjadi: bagaimana cara memasukkan backtick?
Jasper de Vries
1
Meskipun ini bukan jawaban "benar", saya bekerja dengan sekumpulan nama yang tidak memiliki ini, dan saya melakukan satu operasi, jadi ini segera menyelesaikan masalah saya. Terima kasih!
nscalf