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

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
Что делать, если данные вставляются в личные (первые, последние) значения «Джо», «Магазин отца».
Видишь
37

Вам просто нужно удвоить одинарные кавычки ...

insert into Person (First, Last)
values ('Joe', 'O''Brien')
Джастин Нисснер
источник
21

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

Insert into Person
(First, Last)
Values
'Joe', 'O''Brien'
Дэвид Холл
источник
AFAIK Valuesдолжен быть заключен в фигурные скобки (что делает его таким же ответом, как и у @JustinNiessner)
qwerty_so
15

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

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

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

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

OMG пони
источник
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`
eduffy
источник
1
Тогда возникает проблема: как вставить бэкстик?
Джаспер де Врис
1
Хотя это не «правильный» ответ, я работаю с набором имен, у которых его нет, и делаю одноразовые операции, поэтому это сразу решило мою проблему. Спасибо!
nscalf