Jak wstawić wartość zawierającą apostrof (pojedynczy cudzysłów)?

310

Jaka jest poprawna składnia SQL do wstawiania wartości z apostrofem?

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

Ciągle pojawia się błąd, ponieważ myślę, że apostrof po O jest końcowym znacznikiem wartości.

leora
źródło
16
Potwierdź, że nie narażasz się na ataki typu SQL injection. W miarę możliwości używaj parametrów.
Andrew
Jakiego języka skryptowego używasz? W PHP są na przykład funkcje, które wykonują to za Ciebie poprawnie.
philfreo
Zgadzam się z Andrew tutaj: mam nadzieję, że to pytanie dotyczy tylko uruchamiania SQL za pomocą klienta SQL lub „przeglądarki zapytań” lub czegoś takiego, a nie gdzieś w kodzie produkcyjnym. Nieużywanie sparametryzowanych instrukcji jest głupotą.
charstar
to faktycznie jest w kodzie .. gdybym miał sparametryzowane zapytanie czy nie musiałbym robić tego samego?
leora,
2
Negatywny. W zależności od używanej bazy danych i sterownika izolacja parametrów może być obsługiwana w różny sposób, ale parametry w sparametryzowanej instrukcji nie wymagają zmiany znaczenia. Zobacz en.wikipedia.org/wiki/SQL_injection#Preventing_SQL_injection
charstar

Odpowiedzi:

485

Unikaj apostrofu (tzn. Podwoj znak pojedynczego cudzysłowu) w swoim SQL:

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

To samo dotyczy zapytań SELECT:

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

Apostrof lub pojedynczy cudzysłów to znak specjalny w SQL, który określa początek i koniec danych ciągu. Oznacza to, że aby użyć go jako części danych literału, potrzebny jest escapeznak specjalny. W przypadku pojedynczej wyceny zazwyczaj osiąga się to poprzez podwojenie wyceny. (Dwa znaki pojedynczego cudzysłowu, nie podwójne cudzysłowy zamiast pojedynczego cudzysłowu.)

Uwaga : powinieneś martwić się tym problemem tylko podczas ręcznej edycji danych za pomocą surowego interfejsu SQL, ponieważ pisanie zapytań poza programowaniem i testowaniem powinno być rzadkim zjawiskiem. W kodzie są techniki i frameworki (w zależności od stosu), które dbają o unikanie znaków specjalnych, wstrzyknięcie SQL itp.

Paul Sasik
źródło
6
$ linkQuestion = str_replace ("'", "'" ", $ linkQuestion); (Boże, trudno to odczytać!)
462990
co jeśli dane są wstawione do osoby (pierwsza, ostatnia) Wartości „Joe”, „Sklep ojca”.
vijesh
37

Musisz tylko podwoić liczbę pojedynczych cytatów ...

insert into Person (First, Last)
values ('Joe', 'O''Brien')
Justin Niessner
źródło
21

Musisz uciec od apostrofu. W T-SQL jest to z podwójnym apostrofem, więc twoje insertzdanie staje się:

Insert into Person
(First, Last)
Values
'Joe', 'O''Brien'
David Hall
źródło
AFAIK Valuesmusi być zamknięty w nawiasy klamrowe (co czyni go tą samą odpowiedzią, co @JustinNiessner)
qwerty_so
15

Ponieważ pojedynczy cudzysłów służy do wskazania początku i końca łańcucha; musisz uciec.

Krótka odpowiedź polega na użyciu dwóch pojedynczych cudzysłowów - ''- aby baza danych SQL zapisała wartość jako '.

Spójrz na użycie REPLACE do czyszczenia przychodzących wartości:

Chcesz sprawdzić '''' i zastąpić je, jeśli istnieją w ciągu '''''', aby uniknąć pojedynczego cudzysłowu.

Kucyki OMG
źródło
3

eduffy miał dobry pomysł . Właśnie dostał to wstecz w swoim przykładzie kodu. W JavaScript lub SQLite możesz zastąpić apostrof symbolem akcentu.

On (przypadkowo jestem pewien) umieścił symbol akcentu jako ogranicznik łańcucha zamiast zastępować apostrof w O'Brian. W rzeczywistości jest to przerażająco proste rozwiązanie w większości przypadków.

Robert Sherman
źródło
Świetne i znacznie prostsze rozwiązanie, a moje nazwisko to O`Reilly!
PhillipOReilly,
W każdym razie zaleca się stosowanie znaków ucieczki. Przypadkowo :) odkąd używam klawiatury. Podczas pisania dokumentów mimowolnie używam symbolu akcentu zamiast pojedynczego cytatu. (jednak w kodzie używam „jako identyfikatora znaków). Do zeszłego roku, kiedy ktoś powiedział mi swoje hasło i nie mogłem zalogować się do jego systemu. nie mogliśmy rozgryźć do godzin, kiedy piszę „jak”.
Uczeń,
3

Znak apostrofu można wstawić, wywołując funkcję CHAR z wartością wyszukiwania tablicy ASCII apostrofu , 39. Wartości ciągu można następnie konkatenować razem z operatorem konkatenacji .

Insert into Person
  (First, Last)
Values
  'Joe',
  concat('O',char(39),'Brien')
Nathan
źródło
2

Pojedyncze cytaty są unikane przez ich podwojenie ,

Poniższy kod SQL ilustruje tę funkcjonalność.

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

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

select * from @person

Wyniki

First   | Last
===================
Joe     | O'Brien
Max Pringle
źródło
0

użyj podwójnych cudzysłowów wokół wartości.

insert into Person (First, Last) Values("Joe","O'Brien")
błąd_czasu
źródło
3
Zauważ, że nie jest to już standardowy SQL, choć znam Informix, żeby wymienić tylko jeden DBMS, na to pozwala. Powinieneś także odpowiedzieć na pytanie, jak wstawić ciąg, na przykład He said, "Don't!"używając pojedynczych cudzysłowów i / lub podwójnych cudzysłowów - co można zrobić: 'He said, "Don''t!"'lub "He said, ""Don't!""". Dodając nową odpowiedź do ustalonego pytania z zaakceptowanymi odpowiedziami, musisz podać nowe, pełne informacje. Używanie podwójnych cudzysłowów jest nowe - ale ograniczone do kilku DBMS; powinieneś starać się zidentyfikować co najmniej jednego z tych, którzy je akceptują.
Jonathan Leffler
-1

Zamiast tego użyj klawisza strzałki wstecz (na klawiszu ~);

`O'Brien`
zirytowany
źródło
1
Potem pojawia się problem: jak wstawić backtick?
Jasper de Vries
1
Chociaż nie jest to „właściwa” odpowiedź, pracuję z zestawem nazw, które tego nie mają, i wykonuję jednorazowe operacje, więc to natychmiast rozwiązało mój problem. Dzięki!
nscalf