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

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

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

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

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

Чтобы экранировать одинарную кавычку ('), используйте одну обратную косую черту:
```sql
SELECT * FROM your_index WHERE MATCH('l\'italiano');
```


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

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

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

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

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

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

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

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

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

Это также применимо к драйверам, использующим подготовленные выражения (на стороне клиента или сервера). Manticore поддерживает подготовленные выражения на стороне сервера [по протоколу MySQL](../../Connecting_to_the_server/MySQL_protocol.md#Prepared-statements), но `MATCH()` по-прежнему ожидает экранированную строку запроса. Например, при использовании подготовленных выражений PHP PDO вам нужно добавить обратную косую черту для символа `$`:

```php
$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-строки, двойная кавычка и одинарная обратная косая черта автоматически экранируются этими функциями и не требуют явного экранирования.



## В клиентах

[Официальные клиенты](https://github.com/manticoresoftware/) используют под капотом распространенные JSON-библиотеки/функции, доступные в соответствующих языках программирования. Применяются те же правила экранирования, упомянутые ранее.


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

Звездочка (`*`) — это уникальный символ, который служит двум целям:
* как расширитель префикса/суффикса с подстановочным знаком
* как модификатор любого термина внутри фразового поиска.

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

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

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

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

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

```sql
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} |      |
+---------------------+-------------+------+
```