Як вставити значення, яке містить апостроф (одинарна цитата)?


310

Який правильний синтаксис SQL, щоб вставити в нього значення з апострофом?

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

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


16
Підтвердьте, що ви не відкриваєте себе атаками ін'єкцій SQL. Використовуйте параметри там, де це взагалі можливо.
Андрій

Яку мову сценаріїв ви використовуєте? У PHP є, наприклад, функції, щоб зробити це правильно для вас.
philfreo

Погоджуючись з Ендрю тут: я сподіваюся, що це питання стосується лише запуску SQL через клієнт SQL або "браузера запитів" чи такого, а фактично не десь у виробничому коді. Не використовувати параметризовані висловлювання - нерозумно.
charstar

він насправді знаходиться в коді .. якби у мене був параметризований запит, не було б мені робити те саме?
leora

2
Негативний. Залежно від бази даних та драйвера, який ви використовуєте, ізоляція параметрів може оброблятися по-різному, але параметри в параметризованому операторі не потребують виходу. Дивіться 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

що робити, якщо дані "Вставити в особистість (Перша, Остання") "Джо", "Батьківський магазин".
vijesh


21

Вам потрібно уникнути апострофа. У T-SQL це подвійний апостроф, тож ваше insertтвердження стає:

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

AFAIK Valuesповинен бути укладений у фігурні дужки (що робить його такою ж відповіддю, що і @JustinNiessner)
qwerty_so

15

Оскільки для позначення початку та кінця рядка використовується одна лапка; вам потрібно уникнути цього.

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

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

Ви хочете перевірити ''''і замінити їх, якщо вони є в рядку '''''', щоб уникнути самотньої цитати.


3

eduffy мала гарну ідею . Він просто отримав це назад у прикладі коду. Або в JavaScript, або в SQLite ви можете замінити апостроф символом наголосу.

Він (випадково я впевнений) розмістив символ наголосу як роздільник для рядка замість заміни апострофа в О'Бріані. Це насправді жахливо просте рішення для більшості випадків.


Чудове і набагато простіше рішення, і моє прізвище - O`Reilly!
PhillipOReilly

У будь-якому разі рекомендується використовувати символи втечі. Випадково :) з дня використання клавіатури. Я під час написання документів ненавмисно використовую символ наголосу замість однієї цитати. (однак у коді я використовую "як ідентифікатор char"). До минулого року, коли хтось сказав мені свій пароль, і я не зміг увійти до його системи. ми не могли зрозуміти до години, що я набираю "як".
Учень


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
Тоді проблема стає: як вставити backtick?
Джаспер де Вріс

1
Хоча це не "правильна" відповідь, я працюю з набором імен, у яких цього немає, і я роблю одноразові операції, тому це негайно вирішило мою проблему. Дякую!
nscalf
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.