Kesme işareti içeren bir değer nasıl eklenir (tek tırnak)?


310

İçinde kesme işareti olan bir değer eklemek için doğru SQL sözdizimi nedir?

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

O sonra kesme işareti O değeri için bitiş etiketi olduğunu düşünüyorum gibi bir hata alıyorum.


16
Lütfen kendinizi SQL enjeksiyon saldırılarına açmayacağınızı doğrulayın. Mümkün olan yerlerde parametreleri kullanın.
Andrew

Hangi komut dosyası dilini kullanıyorsunuz? PHP'de bunu sizin için doğru yapmak için işlevler vardır.
philfreo

Andrew ile burada aynı fikirdeyim: Umarım bu soru SQL'i bir SQL istemcisi veya "sorgu tarayıcısı" ya da böyle bir yöntemle çalıştırmakla ilgilidir ve aslında üretim kodunun herhangi bir yerinde değildir. Parametreli ifadelerin kullanılmaması saçmadır.
charstar

aslında kodda .. Eğer parametreli bir sorgu olsaydı ben aynı şeyi yapmak zorunda olmaz?
leora

2
Olumsuz. Veritabanına ve kullandığınız sürücüye bağlı olarak, parametrelerin yalıtımı farklı işlenebilir, ancak parametreli bir ifadedeki parametreler kaçmayı gerektirmez. Bkz en.wikipedia.org/wiki/SQL_injection#Preventing_SQL_injection
charstar

Yanıtlar:


485

SQL'inizdeki kesme işaretinden (yani tek tırnak karakterini ikiye katlayın) kaçın:

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

Aynısı SELECT sorguları için de geçerlidir:

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

Kesme işareti veya tek tırnak, SQL'de dize verilerinin başlangıcını ve sonunu belirten özel bir karakterdir. Bu, değişmez dize verilerinizin bir parçası olarak kullanmak escapeiçin özel karaktere ihtiyacınız olduğu anlamına gelir . Tek bir alıntı ile bu genellikle alıntı iki katına çıkarılır. (İki tek tırnak karakteri, tek tırnak yerine çift tırnak değil.)

Not : Bu soruyu yalnızca ham SQL arabirimi aracılığıyla manuel olarak düzenlerken endişelenmelisiniz, çünkü geliştirme ve test dışında sorgu yazma nadir bir durumdur. Kodda, kaçan özel karakterler, SQL enjeksiyonu vb.Ile ilgilenen teknikler ve çerçeveler (yığınıza bağlı olarak) vardır .


6
$ linkQuestion = str_replace ("'", "' '", $ linkQuestion); (okunması zor bir şey!)
user462990

veriler Kişiye Ekle (İlk, Son) Değerler 'Joe', 'Baba'nın dükkanı' ise.
vijesh

37

Sadece tek tırnak üzerinde ikiye katlamak zorunda ...

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

21

Kesme işaretinden kaçmanız gerekiyor. In T-SQL sizin bu nedenle bu, bir çift kesme işareti ile insertbeyan olur:

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

AFAIK, Valuesparantez içine alınmalıdır (bu daha sonra @JustinNiessner ile aynı cevabı yapar)
qwerty_so

15

Bir dizenin başlangıcını ve sonunu belirtmek için tek bir tırnak işareti kullanıldığından; ondan kaçman gerek.

Kısa cevap, ''SQL veritabanının değeri depolaması için iki - tek tırnak kullanmaktır '.

Gelen değerleri sterilize etmek için REPLACE komutunu kullanmaya bakın:

Yalnız tek tırnaktan kaçmak için ''''bunları dizede varsa kontrol etmek ve değiştirmek istiyorsunuz ''''''.


3

eduffy'nin iyi bir fikri vardı . Sadece kod örneğinde geriye döndü. JavaScript veya SQLite'de kesme işaretini aksan sembolüyle değiştirebilirsiniz.

O (kazara eminim) aksan sembolünü O'Brian'daki kesme işaretini değiştirmek yerine dize için ayırıcı olarak yerleştirdi. Bu aslında çoğu durum için son derece basit bir çözümdür.


Harika ve çok daha basit bir çözüm ve benim adım O`Reilly!
PhillipOReilly

Neyse Kaçış karakterleri kullanmanız tavsiye edilir. Yanlışlıkla :) klavye beri günden beri. Belge yazarken yanlışlıkla tek tırnak yerine aksan sembolünü kullanıyorum. (ancak kodda 'char tanımlayıcısı olarak kullanıyorum). Geçen yıla kadar birinin bana şifresini söylediği ve onun sistemine giriş yapamadım. 'yazdığım saatlere kadar anlayamadık.
Öğrenci


2

Tek tırnak işaretleri ikiye katlanarak kaçar ,

Aşağıdaki SQL bu işlevi göstermektedir.

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

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

select * from @person

Sonuçlar

First   | Last
===================
Joe     | O'Brien

0

değerlerin çevresinde çift tırnak işareti kullanın.

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

3
Informix biliyorum ama bir DBMS izin verir, ancak bu artık standart SQL değil unutmayın. Ayrıca örneğin bir dize eklemek istiyorum nasıl ele almalıdır He said, "Don't!"tek tırnak ve / veya çift tırnak kullanarak - yapılabileceği: 'He said, "Don''t!"'ya "He said, ""Don't!""". Uzun süredir köklü bir soruya kabul edilen cevaplarla yeni bir cevap eklerken, yeni ve eksiksiz bilgi vermelisiniz. Çift tırnak kullanmak yenidir - ancak birkaç DBMS ile sınırlıdır; onları kabul edenlerden en az birini tanımlamak için özen göstermelisiniz.
Jonathan Leffler

-1

Bunun yerine bir backtick kullanın (~ tuşunda);

`O'Brien`

1
Sonra sorun olur: bir backtick nasıl eklenir?
Jasper de Vries

1
Bu "doğru" cevap olmasa da, buna sahip olmayan bir dizi isim ile çalışıyorum ve bir defalık işlemler yapıyorum, bu da derhal sorunumu çözdü. Teşekkürler!
nscalf
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.