Как избежать одиночной кавычки в SQL Server?


957

Я пытаюсь insertнекоторые текстовые данные в таблицу в SQL Server9.

Текст включает в себя одну цитату (').

Как мне избежать этого?

Я попытался использовать две одинарные кавычки, но это привело меня к ошибкам.

например. insert into my_table values('hi, my name''s tim.');


30
«это бросило мне некоторые ошибки» - что это были за ошибки?
llamaoo7

Да, потому что правильный способ вставить одинарные кавычки в MSSQL - это удвоить их. Пример, который вы показываете нам, должен работать. Как сделать этот SQL-запрос, на каком языке? Или это в SQL Server Management Studio?
MaxiWheat

Ответы:


1389

Одиночные кавычки можно избежать, удвоив их , как вы показали нам в своем примере. Следующий SQL иллюстрирует эту функциональность. Я проверил это на SQL Server 2008:

DECLARE @my_table TABLE (
    [value] VARCHAR(200)
)

INSERT INTO @my_table VALUES ('hi, my name''s tim.')

SELECT * FROM @my_table

Результаты

value
==================
hi, my name's tim.

16
я искал не в том месте, чтобы решить мою проблему. в конце концов, это была не проблема побега персонажа. моя проблема заключалась в том, что длина данных была превышена. спасибо, что заверил меня, что двойная кавычка - это правильный способ избежать персонажа.
tim_wonil

Итак, если у меня есть текст, содержащий 10 тыс. Слов, необходимо будет заменить весь мой текст?
Виниций Лима

3
@ViniciusLima: краткий ответ - да. Это может измениться в зависимости от технологии, которую вы собираетесь использовать для хранения данных. Если вы используете ORM, он сделает это за вас. Если вы создаете свои команды SQL вручную, вы захотите использовать функциональность языка «подготовленные операторы». Если вы делаете это в Management Studio, то вам придется сделать замену.
Cᴏʀʏ

1
т.е. две одинарные кавычки для одного. [''] => [']
Уджвал Сингх

67

Если экранирование одной цитаты с другой одинарной кавычкой не работает для вас (как это было для одного из моих недавних REPLACE()запросов), вы можете использовать его SET QUOTED_IDENTIFIER OFFдо запроса, а затем SET QUOTED_IDENTIFIER ONпосле запроса.

Например

SET QUOTED_IDENTIFIER OFF;

UPDATE TABLE SET NAME = REPLACE(NAME, "'S", "S");

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again

2
Обычно я использую метод удвоения, но когда я генерировал динамический SQL, который затем запускался на нескольких серверах и базах данных, это решение работало для меня, тогда как удвоение не было в одном конкретном случае. Спасибо за это!
Ричард Мосс

Будьте внимательны при обращении к представлениям и индексам в вычисляемых столбцах, иначе вы можете получить ошибку. stackoverflow.com/questions/9235527/…
датагод

@RichardMoss, +1. тот же сценарий с вами. Удвоенный подход является исходным решением. Для сложных запросов, таких как динамический SQL на нескольких серверах, это будет работать, дублирование может не
сработать

48

Как насчет:

insert into my_table values('hi, my name' + char(39) + 's tim.')

18
используйте вместо этого char (39)
Iswanto San

17

Удвоение цитаты должно было сработать, поэтому странно, что оно не сработало для вас; однако альтернативой является использование двойных кавычек вместо одинарных символов в строке. То есть,

insert into my_table values("hi, my name's tim.");


4
Что если текст содержит как одинарные, так и двойные кавычки? Кроме того, не зарезервированы ли двойные кавычки только для имен полей?
Лайош

11

2 способа обойти это:


потому что 'вы можете просто удвоить его в строке, например select 'I''m happpy'- получите:I'm happy


Для любого персонажа, в котором вы не уверены: на сервере sql вы можете получить юникод любого символа по select unicode(':')(вы сохраняете номер)

Так что в этом случае вы также можете select 'I'+nchar(39)+'m happpy'


6

Также следует обратить внимание на то, действительно ли он хранится как классический ASCII '(ASCII 27) или Unicode 2019 (который выглядит аналогично, но не одинаково).

Это не имеет большого значения для вставок, но это может означать мир выбора и обновления.
Если это значение в юникоде, то экранирование 'в предложении WHERE (например, где blah =' Workers''s Comp ') вернет, что искомого значения нет, если' в "Worker's Comp" на самом деле значение Юникода.

Если ваше клиентское приложение поддерживает ввод с произвольным ключом, а также ввод на основе копирования и вставки, это может быть Unicode в одних строках и ASCII в других!

Простой способ подтвердить это - выполнить какой-то открытый запрос, который вернет искомое значение, а затем скопировать и вставить его в notepad ++ или другой редактор, поддерживающий юникод.

Различный вид между значением ascii и значением unicode должен быть очевиден для глаз, но если вы склонитесь к анальному, он будет отображаться как 27 (ascii) или 92 (unicode) в шестнадцатеричном редакторе.


4

Многие из нас знают, что популярный метод избежания одиночных кавычек заключается в их удвоении, как показано ниже.

PRINT 'It''s me, Arul.';

Удвоение метода одинарных кавычек

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

1.Юникод

39 - UNICODE-символ одинарной кавычки. Таким образом, мы можем использовать его, как показано ниже.

PRINT 'Hi,it'+CHAR(39)+'s Arul.';
PRINT 'Helo,it'+NCHAR(39)+'s Arul.';

Символы Юникода

2.QUOTED_IDENTIFIER

Другое простое и лучшее альтернативное решение - использовать QUOTED_IDENTIFIER. Когда QUOTED_IDENTIFIER установлен на OFF, строки могут быть заключены в двойные кавычки. В этом сценарии нам не нужно избегать одинарных кавычек. Таким образом, этот способ был бы очень полезен при использовании большого количества строковых значений в одинарных кавычках. Это будет очень полезно при использовании такого количества строк сценариев INSERT / UPDATE, где значения столбцов имеют одинарные кавычки.

SET QUOTED_IDENTIFIER OFF;
PRINT "It's Arul."
SET QUOTED_IDENTIFIER ON;

QUOTE_IDENTIFIER

ВЫВОД

Вышеупомянутые методы применимы как к AZURE, так и к помещениям.


1

Следующий синтаксис избавит вас от ТОЛЬКО ОДНОЙ кавычки:

SELECT ''''

Результатом будет одинарная кавычка. Может быть очень полезно для создания динамического SQL :). введите описание изображения здесь


0

Это должно работать

DECLARE @singleQuote CHAR 
SET @singleQuote =  CHAR(39)

insert into my_table values('hi, my name'+ @singleQuote +'s tim.')

0

Просто вставьте ', прежде чем что-либо вставлять. Это будет как escape-символ в sqlServer

Пример: когда у вас есть поле как, я в порядке . Вы можете сделать: ОБНОВИТЬ my_table SET row = 'Я в порядке.';


Разве это не то, что сделал ОП, и то же самое, что уже сказано в ответе с наибольшим количеством голосов? Предположительно, должен быть какой-то другой источник ошибки.
Майкл Макаскилл

-3

Это должно работать: использовать обратную косую черту и поставить двойную кавычку

"UPDATE my_table SET row =\"hi, my name's tim.\";

Что вы имеете в виду? Вы говорите, что PRINT \"hi, my name's tim.\";собираетесь работать в SSMS? Это не работает вообще, и никто никогда не говорил, что это работает.
Мухаммед Мусави

Никогда не сработает.
Сантош Джади
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.