Экранирование символов в строке запроса

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

Следующие символы должны быть экранированы с помощью обратного слэша (\):

!    "    $    '    (    )    -    /    <    @    \    ^    |    ~

В командной строке MySQL

Для экранирования одинарной кавычки ('), используйте один обратный слэш:

SELECT * FROM your_index WHERE MATCH('l\'italiano');

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

SELECT * FROM your_index WHERE MATCH('r\\&b | \\(official video\\)');

Чтобы использовать обратный слэш как символ, необходимо экранировать и обратный слэш как символ, и обратный слэш как оператор экранирования, что требует четырёх обратных слэшей:

SELECT * FROM your_index WHERE MATCH('\\\\ABC');

Когда вы работаете с JSON-данными в Manticore Search и нужно включить двойную кавычку (") внутри JSON-строки, важно правильно её экранировать. В JSON двойная кавычка внутри строки экранируется с помощью обратного слэша (\). Однако при вставке JSON-данных через SQL-запрос Manticore Search интерпретирует обратный слэш (\) как символ экранирования внутри строк.

Чтобы двойная кавычка была корректно вставлена в JSON-данные, необходимо экранировать сам обратный слэш. Это приводит к использованию двух обратных слэшей (\\) перед двойной кавычкой. Например:

insert into tbl(j) values('{"a": "\\"abc\\""}');

Использование драйверов MySQL

Драйверы MySQL предоставляют функции экранирования (например, mysqli_real_escape_string в PHP или conn.escape_string в Python), но они экранируют только определённые символы. Вам всё равно нужно будет добавить экранирование для символов из ранее упомянутого списка, которые не экранируются соответствующими функциями. Поскольку эти функции экранируют обратный слэш за вас, вам нужно добавить только один обратный слэш.

Это также относится к драйверам, поддерживающим (клиентские) подготовленные выражения. Например, с подготовленными выражениями PHP PDO необходимо добавить обратный слэш для символа $:

$statement = $ln_sph->prepare( "SELECT * FROM index WHERE MATCH(:match)");
$match = '\$manticore';
$statement->bindParam(':match',$match,PDO::PARAM_STR);
$results = $statement->execute();

В результате получается итоговый запрос SELECT * FROM index WHERE MATCH('\\$manticore');

В HTTP JSON API

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

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

В клиентах

Официальные клиенты используют общие JSON-библиотеки/функции, доступные в соответствующих языках программирования. Применяются те же правила экранирования, упомянутые ранее.

Экранирование звёздочки

Звёздочка (*) — уникальный символ, который выполняет две функции:

  • как подстановочный символ в начале/конце слова
  • как модификатор "любой термин" внутри поиска по фразе.

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

В запросах без подстановочных символов звёздочка не требует экранирования, независимо от того, находится ли она в charset_table или нет.

В запросах с подстановочными символами звёздочка в середине слова не требует экранирования. В качестве оператора подстановки (в начале или конце слова) звёздочка всегда будет интерпретироваться как оператор подстановки, даже если применяется экранирование.

Экранирование имён узлов JSON в SQL

Для экранирования специальных символов в узлах JSON используйте обратные кавычки. Например:

MySQL [(none)]> select * from t where json.`a=b`=234;
+---------------------+-------------+------+
| id                  | json        | text |
+---------------------+-------------+------+
| 8215557549554925578 | {"a=b":234} |      |
+---------------------+-------------+------+

MySQL [(none)]> select * from t where json.`a:b`=123;
+---------------------+-------------+------+
| id                  | json        | text |
+---------------------+-------------+------+
| 8215557549554925577 | {"a:b":123} |      |
+---------------------+-------------+------+
Last modified: August 28, 2025