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.


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.


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')

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'

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.


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.


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


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

0

gunakan tanda kutip ganda di sekitar nilai.

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

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`

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.