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

Jaka jest prawidłowa składnia SQL, aby wstawić do niej wartość z apostrofem?

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

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

Author: Peter Mortensen, 2009-12-16

9 answers

Unikaj apostrofu (tzn. podwajaj pojedynczy znak cudzysłowu) w 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, jest znakiem specjalnym w SQL, który określa początek i koniec łańcucha danych. Oznacza to, że aby użyć go jako części swoich literalnych danych, Musisz escape Znak specjalny. Z jednym cytatem jest to zazwyczaj realizowane przez podwojenie cytatu. (Dwa pojedyncze znaki cudzysłowu, nie podwójny cytat zamiast pojedynczego cytatu.)

Uwaga: problem ten należy zawsze martwić tylko wtedy, gdy ręcznie edytujesz dane za pomocą surowego interfejsu SQL, ponieważ pisanie zapytań poza rozwojem i testowaniem powinno być rzadkim zjawiskiem. W kodzie są techniki i frameworki (w zależności od stosu), które dbają o znaki specjalne, SQL injection , itp.

 359
Author: Paul Sasik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-25 16:31:17

Musisz tylko podwoić pojedyncze cytaty...

insert into Person (First, Last)
values ('Joe', 'O''Brien')
 28
Author: Justin Niessner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-16 03:36:55

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

Insert into Person
(First, Last)
Values
'Joe', 'O''Brien'
 16
Author: David Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-25 16:31:57

Ponieważ pojedynczy cudzysłów jest używany do wskazania początku i końca łańcucha; musisz z niego uciec.

Krótka odpowiedź to użycie dwóch pojedynczych cudzysłowów - '' - w celu przechowywania wartości w bazie danych SQL jako '.

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

Chcesz sprawdzić dla '''', i zastąp je, jeśli istnieją w łańcuchu za pomocą '''''', aby uniknąć pojedynczego cytatu.
 12
Author: OMG Ponies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-25 16:32:56

Eduffy miał dobry pomysł . W swoim przykładzie kodowym dostał to od tyłu. W JavaScript lub SQLite możesz zastąpić apostrof symbolem akcentu.

On (przypadkowo jestem pewien) umieścił symbol akcentu jako ogranicznik dla ciągu znaków zamiast zastępowania apostrofu w O ' Brian. Jest to w rzeczywistości niezwykle proste rozwiązanie dla większości przypadków.

 1
Author: Robert Sherman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:28

Znak apostrofu można wstawić przez wywołanie funkcji CHAR z wartością ASCII table lookup apostrofu, 39. Wartości łańcuchowe mogą być następnie konkatenowane razem z operatorem concatenate .

Insert into Person
  (First, Last)
Values
  'Joe',
  concat('O',char(39),'Brien')
 1
Author: Nathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-12 11:57:57

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

insert into Person (First, Last) Values("Joe","O'Brien")
 1
Author: run_time_error,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-30 07:07:33

Pojedyncze cytaty są unikane przez podwojenie ich w górę ,

Poniższy 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
Author: Max Pringle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-24 17:25:48

Zamiast tego użyj backticka (na klawiszu~);

`O'Brien`
 -2
Author: eduffy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-16 03:35:47