Перейти к содержимому

Как экранировать кавычки в sql

  • автор:

Как экранировать одинарные кавычки?

Необходимо удваивать кавычки, как верно замечено в комментариях к вопросу:

SELECT ' for=''213'' '; 

Или же escape string (требует явного указания на возможное содержание escape последовательностей)

SELECT E' for=\'213\' '; 

Так же есть возможность вовсе не извращаться с кавычками, а использовать синтаксис строковых литералов Dollar-quoted String (там же в мануале)

SELECT $$ for='213' $$; SELECT $anystring$ for='213' $anystring$; 

Если же данные приходят от пользователя через приложение — то используйте prepared statements (или его эмуляцию вашей библиотекой доступа) и тогда вас экранирование не беспокоит вовсе.

Как экранировать кавычки в sql

Строка представляет собой последовательность символов, заключенных либо в одинарные кавычки ( `» ) — апострофы, либо в двойные кавычки ( `»‘ ). При использовании диалекта ANSI SQL допустимы только одинарные кавычки. Например:

'a string' "another string"

Внутри строки некоторые последовательности символов имеют специальное назначение. Каждая из этих последовательностей начинается обратным слешем ( `\’ ), известным как escape-символ или символ перехода. MySQL распознает следующие escape-последовательности:

\0 Символ 0 ( NUL ) в ASCII коде. \’ Символ одиночной кавычки ( `» ). \» Символ двойной кавычки ( `»‘ ). \b Возврат на один символ. \n Символ новой строки (перевода строки). \r Символ перевода каретки. \t Символ табуляции. \z Символ (Control-Z) таблицы ASCII(26). Данный символ можно закодировать, чтобы обойти проблему, заключающуюся в том, что под Windows ASCII(26) означает конец файла (проблемы возникают при использовании ASCII(26) в выражении mysql database < filename) . \\ Символ обратного слеша. \% Символ процентов `%' . Используется для поиска копий литерала `%' в контекстах, где выражение `%' в противном случае интерпретировалось бы как групповой символ (see section 6.3.2.1 Функции сравнения строк). \ `_' Символ подчеркивания `_' . Используется для поиска копий литерала `_' в контекстах, где выражение `_' в противном случае интерпретировалось бы как групповой символ (see section 6.3.2.1 Функции сравнения строк).

Обратите внимание на то, что при использовании `\%’ или `\_’ в контекстах некоторых строк будут возвращаться значения строк `\%’ и `\_’ , а не `%’ и `_’ .

Существует несколько способов включить кавычки в строку:

  • Одиночная кавычка (апостроф) `» внутри строки, заключенной в кавычки `» , может быть записана как `»’ .
  • Двойная кавычка `»‘ внутри строки, заключенной в двойные кавычки `»‘ , может быть записана как `»»‘ .
  • Можно предварить символ кавычки символом экранирования ( `\’ ).
  • Для символа `» внутри строки, заключенной в двойные кавычки, не требуется специальной обработки; его также не требуется дублировать или предварять обратным слешем. Точно так же не требует специальной обработки двойная кавычка `»‘ внутри строки, заключенной в одиночные кавычки `» .

Ниже показаны возможные варианты применения кавычек и escape-символа на примерах выполнения команды SELECT:

mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello'; +-------+---------+-----------+--------+--------+ | hello | "hello" | ""hello"" | hel'lo | 'hello | +-------+---------+-----------+--------+--------+ mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello"; +-------+---------+-----------+--------+--------+ | hello | 'hello' | ''hello'' | hel"lo | "hello | +-------+---------+-----------+--------+--------+ mysql> SELECT "This\nIs\nFour\nlines"; +--------------------+ | This Is Four lines | +--------------------+

Если необходимо вставить в строку двоичные данные (такие как BLOB ), следующие символы должны быть представлены как escape-последовательности:

NUL ASCII 0. Необходимо представлять в виде `\0′ (обратный слеш и символ ASCII `0′ ). \ ASCII 92, обратный слеш. Представляется как `\\’ . ‘ ASCII 39, единичная кавычка. Представляется как `\» . » ASCII 34, двойная кавычка. Представляется как `\»‘ .

При написании программы на языке C для добавления символов экранирования в команде INSERT можно использовать функцию mysql_real_escape_string() из C API (see section 8.4.2 Обзор функций интерфейса C). При программировании на Perl можно использовать метод quote из пакета DBI для превращения специальных символов в соответствующие escape-последовательности (see section 8.2.2 Интерфейс DBI ).

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

В качестве альтернативы многие интерфейсы прикладного программирования (API) для MySQL предоставляют определенную возможность использования символов-заменителей, что позволяет вносить специальные маркеры в строку запроса и затем связывать с ними значения данных при выдаче результатов запроса.

Экранирование спецсимволов в SQL запросах

Обычно для экранирования спецсимволов в SQL-запросах используется символ обратной косой черты. Но символ апострофа можно экранировать вторым символом апострофа. Другими словами два символа апострофа подряд считаются одним экранированным апострофом. Примеры для MySQL:

INSERT INTO `text_table`(`text`) VALUES (‘as»df’);

Стандартный способ экранирования:

INSERT INTO `text_table`(`text`) VALUES (‘as\’df’);

INSERT INTO `text_table`(`text`) VALUES (‘as\\df’);

А вот экранировать слеш при помощи апострофа нельзя, такой запрос не сработает:

INSERT INTO `text_table`(`text`) VALUES (‘as’\df’);

В новых версиях Postgresql апостроф нельзя экранировать при помощи обратной косой черты.

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

STRING_ESCAPE (Transact-SQL)

Экранирует специальные символы в тексте и возвращает текст с экранированными символами. STRING_ESCAPE — это детерминированная функция, впервые представленная в SQL Server 2016.

Синтаксис

STRING_ESCAPE( text , type ) 

Аргументы

text
Выражениеnvarchar, представляющее объект, который следует экранировать.

type
Правила экранирования, которые будут применены. В настоящее время поддерживается значение ‘json’ .

Типы возвращаемых данных

Текст nvarchar(max) с экранированными специальными и управляющими символами. В настоящее время с помощью функции STRING_ESCAPE можно экранировать только специальные символы JSON, представленные в таблицах ниже.

Специальный символ Закодированная последовательность
Кавычки («»)
Обратная косая черта (\) \\
Солидус (/) \/
Отмена \b
Перевод страницы \f
Новая строка \n
Возврат каретки \r
Горизонтальная табуляция \t
Управляющий символ Закодированная последовательность
CHAR(0) \u0000
CHAR(1) \u0001
. .
CHAR(31) \u001f

Remarks

Примеры

A. Экранирование текста согласно правилам форматирования JSON

Приведенный ниже запрос экранирует специальные символы с использованием правил JSON и возвращает экранированный текст.

SELECT STRING_ESCAPE('\ / \\ " ', 'json') AS escapedText; 
escapedText ------------------------------------------------------------- \\\t\/\n\\\\\t\"\t 

Б. Форматирование объекта JSON

Приведенный ниже запрос создает текст в формате JSON на основе числовых и строковых переменных, а затем экранирует все специальные символы JSON в переменных.

SET @json = FORMATMESSAGE('< "id": %d,"name": "%s", "surname": "%s" >', 17, STRING_ESCAPE(@name,'json'), STRING_ESCAPE(@surname,'json') ); 

См. также:

  • CONCAT (Transact-SQL)
  • CONCAT_WS (Transact-SQL)
  • FORMATMESSAGE (Transact-SQL)
  • QUOTENAME (Transact-SQL)
  • REPLACE (Transact-SQL)
  • REVERSE (Transact-SQL)
  • STRING_AGG (Transact-SQL)
  • STUFF (Transact-SQL)
  • TRANSLATE (Transact-SQL)
  • Строковые функции (Transact-SQL)

Обратная связь

Были ли сведения на этой странице полезными?

Обратная связь

Отправить и просмотреть отзыв по

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *