Поиск русскоязычных данных в базе данных или в системе электронного документооборота часто ломается из‑за несоответствия кодировок между клиентским редактором запросов, соединением с сервером и самой базой. В результате вместо ожидаемых слов появляются «кракозябры», а запросы с русскими символами не возвращают результатов.
В этой статье мы разберём, как правильно настроить кодировку в популярных редакторах запросов (MySQL‑client, DBeaver, KQL‑editor, PL/SQL Developer и др.), чтобы поиск от‑воротов (текстовых фрагментов) по‑русски работал без ошибок.
Содержание
- Почему кодировка важна?
- Типичные проблемы и их симптомы
- MySQL: настройка кодировки соединения
- DBeaver и другие GUI‑клиенты
- Редактор KQL (eDiscovery) и поиск по‑русски
- PHP‑приложения:
SET NAMESиheader - AJAX‑запросы и URL‑энкодинг
- Лучшие практики
- Контрольный список
Почему кодировка важна?
Кодировка определяет, как байты преобразуются в символы. Если клиент отправляет запрос в cp1251, а сервер ожидает utf8, то каждый русский символ будет интерпретирован как набор чужих байтов – получаем «????» или «ÐÑивеѻ.
Для корректного поиска от‑воротов (фрагментов текста) необходимо, чтобы:
- Текст в базе был сохранён в единой кодировке (рекомендация –
utf8mb4). - Соединение клиента с сервером использовало ту же кодировку.
- Редактор запросов отображал вводимые символы в правильной кодировке.
Типичные проблемы и их симптомы
| Симптом | Причина | Как проверить |
|---|---|---|
| Кракозябры в результатах SELECT | Несоответствие кодировки соединения и таблицы | SELECT HEX(column) FROM table LIMIT 1; |
| Поиск по русским словам ничего не находит | Запрос передаётся в другой кодировке (например, latin1) | SHOW VARIABLES LIKE ‘character_set%’; |
| GET‑параметры в URL выглядят как %D0%9F%D1%80… | Не выполнен URL‑энкодинг в UTF‑8 | Проверьте console.network в браузере |
MySQL: настройка кодировки соединения
Самый надёжный способ – явно указывать кодировку сразу после установления соединения.
Через SQL‑запросы
-- Установить кодировку соединения в cp1251
SET NAMES 'cp1251';
SET CHARACTER SET cp1251;
-- Или в UTF‑8 (рекомендовано)
SET NAMES utf8mb4;
SET CHARACTER SET utf8mb4;
Эти запросы можно выполнить автоматически в начале каждой сессии (например, в mysqli_connect или в PDO::exec).
Через параметры подключения
// mysqli
$mysqli = new mysqli($host, $user, $pass, $db);
$mysqli->set_charset('utf8mb4');
// PDO
$dsn = "mysql:host=$host;dbname=$db;charset=utf8mb4";
$pdo = new PDO($dsn, $user, $pass);
Проверка текущих настроек
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
Убедитесь, что character_set_client, character_set_connection и character_set_results совпадают с кодировкой ваших данных.
DBeaver и другие GUI‑клиенты
Графические редакторы часто берут кодировку из настроек драйвера. Ниже – шаги для DBeaver (один из самых популярных).
- Откройте Database Navigator, правой кнопкой мыши кликните на соединение → Edit Connection.
- Перейдите на вкладку Driver Properties.
- Найдите параметр
characterEncodingи задайтеutf8mb4(илиcp1251, если база действительно в этой кодировке). - Установите
useUnicode=true. - Сохраните и переподключитесь.
После этого в окне SQL Editor** вводимые русские символы будут отображаться корректно, а результаты запросов – без «кракозябр».
Редактор KQL (eDiscovery) и поиск по‑русски
KQL (Keyword Query Language) используется в Microsoft 365 eDiscovery, Azure Search и т.п. По умолчанию система работает в UTF‑8, но иногда в UI‑редакторе может быть выбран неверный Locale.
- Убедитесь, что в настройках Search Service выбран
language:ruилиlang:ru. - При вводе запроса в
Ключевые словаиспользуйте прямой ввод русских слов, без кавычек, если требуеться точное совпадение. - Для «по‑частям» (от‑воротов) применяйте оператор :
текст OR *текст
Если в UI‑редакторе отображаются «?», проверьте, что браузер использует UTF‑8 (в Chrome → View → Encoding → UTF‑8).
PHP‑приложения: SET NAMES и заголовки
<?php
// Подключаемся к MySQL
$pdo = new PDO('mysql:host=localhost;dbname=mydb;charset=utf8mb4',
'user', 'pass',
[PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"]);
// Теперь любые запросы с русскими словами работают корректно
$stmt = $pdo->prepare('SELECT * FROM articles WHERE title LIKE :q');
$stmt->execute(['q' => "%привет%"]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
Важно:
- В
.htaccessдобавитьAddDefaultCharset utf-8(как в примерах из интернета). - Если сервер использует
latin1_swedish_ciпо умолчанию, переопределите его вmy.cnf:[client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci
AJAX‑запросы и URL‑энкодинг
При отправке поисковой строки через GET‑запрос необходимо гарантировать, что строка закодирована в UTF‑8.
// JavaScript (ES6)
const query = encodeURIComponent('поиск отворотов');
fetch(`/search?q=${query}`)
.then(r => r.json)
.then(data => console.log(data));
На сервере (PHP, Node.js, Python) полученный параметр следует декодировать в UTF‑8:
// PHP
$q = urldecode($_GET['q']); // уже в UTF‑8
Если в запросе используется application/x-www-form-urlencoded, убедитесь, что charset=UTF-8 указан в заголовке Content-Type.
Лучшие практики
- Всегда храните данные в UTF‑8 (utf8mb4). Это избавит от большинства проблем с «кракозябрами».
- Устанавливайте кодировку соединения сразу после подключения (
SET NAMESили драйверные параметры). - Проверяйте
character_set_*переменные в MySQL – они должны совпадать. - Для GUI‑клиентов (DBeaver, DataGrip, SQLyog) явно указывайте
characterEncodingв настройках драйвера. - При работе с API и AJAX используйте
encodeURIComponentи проверяйте заголовокContent-Type. - Тестируйте запросы в консоли MySQL:
SELECT HEX('привет');должно возвращатьD0 9F D1 80 D0 B8 D0 B2 D0 B5 D1 82(UTF‑8).
Контрольный список перед запуском
- База данных:
utf8mb4+utf8mb4_unicode_ci(или нужная колляция). - Параметры сервера MySQL (
my.cnf) –character-set-serverиcollation-serverзаданы. - Клиентское приложение:
SET NAMES utf8mb4выполнен сразу после соединения. - GUI‑клиент (DBeaver, DataGrip, etc.) –
characterEncoding=utf8mb4иuseUnicode=true. - Веб‑страница:
<meta charset="UTF-8">и заголовокContent-Type. - AJAX/GET‑запросы – параметры закодированы через
encodeURIComponent. - Тестовый запрос:
SELECT * FROM table WHERE column LIKE '%поиск%';возвращает ожидаемые строки.
Корректный поиск от‑воротов по‑русски – это вопрос согласованности кодировок на всех уровнях: от физического хранения данных до отображения в редакторе запросов. Следуя рекомендациям, приведённым в этой статье, вы избавитесь от «кракозябр», обеспечите стабильную работу поисковых функций и упростите поддержку проекта.
Если после выполнения всех шагов проблема сохраняется, проверьте логи сервера MySQL (включите general_log) и убедитесь, что запрос действительно приходит в нужной кодировке.
Удачной разработки!