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.


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.


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

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'

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.


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.


Ś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ń,


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

0

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

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

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`

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.