Как вставить значение, содержащее апостроф (одинарную кавычку)?


310

Какой правильный синтаксис SQL для вставки значения с апострофом в нем?

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

Я продолжаю получать сообщение об ошибке, так как считаю апостроф после O конечным тегом для значения.


16
Пожалуйста, подтвердите, что вы не открываете себя атакам SQL-инъекций Используйте параметры там, где это возможно.
Эндрю

Какой язык сценариев вы используете? Например, в PHP есть функции, которые делают это правильно для вас.
Philfreo

Здесь я согласен с Эндрю: я надеюсь, что этот вопрос касается только запуска SQL через клиент SQL или «браузер запросов» или чего-то подобного, а не где-то в рабочем коде. Не использовать параметризованные операторы глупо.
charstar

это на самом деле в коде .. если бы у меня был параметризованный запрос, я бы не сделал то же самое?
leora

2
Negative. В зависимости от базы данных и используемого вами драйвера изоляция параметров может обрабатываться по-разному, но параметры в параметризованном операторе не требуют экранирования. См en.wikipedia.org/wiki/SQL_injection#Preventing_SQL_injection
charstar

Ответы:


485

Избегайте апострофа (т.е. удваивайте символ одинарной кавычки) в вашем SQL:

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

То же самое относится к запросам SELECT:

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

Апостроф или одинарная кавычка - это специальный символ в SQL, который указывает начало и конец строковых данных. Это означает, что для использования его как части ваших строковых данных вам необходим escapeспециальный символ. С помощью одной цитаты это обычно достигается путем удвоения вашей цитаты. (Два символа одинарных кавычек, а не двойные кавычки вместо одинарных.)

Примечание . Об этой проблеме следует беспокоиться только в том случае, если вы вручную редактируете данные через необработанный интерфейс SQL, поскольку написание запросов вне разработки и тестирования должно быть редким явлением. В коде есть методы и структуры (в зависимости от вашего стека), которые заботятся о экранировании специальных символов, внедрении SQL и т. Д.


6
$ linkQuestion = str_replace ("'", "' '", $ linkQuestion); (черт возьми, это трудно читать!)
user462990

Что делать, если данные вставляются в личные (первые, последние) значения «Джо», «Магазин отца».
Видишь


21

Вам нужно избежать апострофа. В T-SQL это с двойным апострофом, поэтому ваше insertутверждение становится:

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

AFAIK Valuesдолжен быть заключен в фигурные скобки (что делает его таким же ответом, как и у @JustinNiessner)
qwerty_so

15

Потому что для указания начала и конца строки используется одинарная кавычка; Вы должны избежать этого.

Короткий ответ - использовать две одинарные кавычки - ''для того, чтобы база данных SQL сохраняла значение как '.

Посмотрите, как использовать REPLACE для очистки входящих значений:

Вы хотите проверить ''''и заменить их, если они существуют в строке '''''', чтобы избежать одиночной одиночной кавычки.


3

У Эдуффи была хорошая идея . Он просто получил это назад в своем примере кода. В JavaScript или в SQLite апостроф можно заменить символом акцента.

Он (случайно я уверен) поместил символ акцента в качестве разделителя для строки вместо того, чтобы заменить апостроф в О'Брайане. На самом деле это чрезвычайно простое решение для большинства случаев.


Отличное и гораздо более простое решение, и моя фамилия O`Reilly!
PhillipOReilly

В любом случае рекомендуется использовать escape-символы. Случайно :) со дня я использую клавиатуру. Я случайно использую символ акцента вместо одинарных кавычек при написании документов. (однако в коде я использую 'как идентификатор символа). До прошлого года, когда кто-то сказал мне его пароль, и я не смог войти в его систему. мы не могли понять до тех пор, пока я не наберу 'как `.
Учащийся


2

Одиночные кавычки избегают, удваивая их ,

Следующий SQL иллюстрирует эту функциональность.

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

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

select * from @person

Полученные результаты

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

0

используйте двойные кавычки вокруг значений.

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

3
Обратите внимание, что это уже не стандартный SQL, хотя я знаю Informix, и это можно назвать только одной СУБД. Вы также должны указать, как вставить строку, например, He said, "Don't!"использовать одинарные и / или двойные кавычки - что можно сделать: 'He said, "Don''t!"'или "He said, ""Don't!""". При добавлении нового ответа на давно установленный вопрос с принятыми ответами вы должны предоставить новую полную информацию. Использование двойных кавычек является новым, но ограничено несколькими СУБД; Вы должны приложить усилия, чтобы определить хотя бы одного из тех, кто их принимает.
Джонатан Леффлер

-1

Вместо этого используйте обратную черту (на клавише ~);

`O'Brien`

1
Тогда возникает проблема: как вставить бэкстик?
Джаспер де Врис

1
Хотя это не «правильный» ответ, я работаю с набором имен, у которых его нет, и делаю одноразовые операции, поэтому это сразу решило мою проблему. Спасибо!
nscalf
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.