Как экранировать одинарные кавычки?
Необходимо удваивать кавычки, как верно замечено в комментариях к вопросу:
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)
Обратная связь
Были ли сведения на этой странице полезными?
Обратная связь
Отправить и просмотреть отзыв по