Настройка кодировки для корректного поиска русского текста в базах данных и редакторах запросов

Настройте кодировку в DBeaver, MySQL и PL/SQL за 5 минут. Русский текст найдётся мгновенно, а «кракозябры» исчезнут навсегда.

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

В этой статье мы разберём, как правильно настроить кодировку в популярных редакторах запросов (MySQL‑client, DBeaver, KQL‑editor, PL/SQL Developer и др.), чтобы поиск от‑воротов (текстовых фрагментов) по‑русски работал без ошибок.

Содержание

  1. Почему кодировка важна?
  2. Типичные проблемы и их симптомы
  3. MySQL: настройка кодировки соединения
  4. DBeaver и другие GUI‑клиенты
  5. Редактор KQL (eDiscovery) и поиск по‑русски
  6. PHP‑приложения: SET NAMES и header
  7. AJAX‑запросы и URL‑энкодинг
  8. Лучшие практики
  9. Контрольный список

Почему кодировка важна?

Кодировка определяет, как байты преобразуются в символы. Если клиент отправляет запрос в 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 (один из самых популярных).

  1. Откройте Database Navigator, правой кнопкой мыши кликните на соединение → Edit Connection.
  2. Перейдите на вкладку Driver Properties.
  3. Найдите параметр characterEncoding и задайте utf8mb4 (или cp1251, если база действительно в этой кодировке).
  4. Установите useUnicode=true.
  5. Сохраните и переподключитесь.

После этого в окне 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).

Контрольный список перед запуском

  1. База данных: utf8mb4 + utf8mb4_unicode_ci (или нужная колляция).
  2. Параметры сервера MySQL (my.cnf) – character-set-server и collation-server заданы.
  3. Клиентское приложение: SET NAMES utf8mb4 выполнен сразу после соединения.
  4. GUI‑клиент (DBeaver, DataGrip, etc.) – characterEncoding=utf8mb4 и useUnicode=true.
  5. Веб‑страница: <meta charset="UTF-8"> и заголовок Content-Type.
  6. AJAX/GET‑запросы – параметры закодированы через encodeURIComponent.
  7. Тестовый запрос: SELECT * FROM table WHERE column LIKE '%поиск%'; возвращает ожидаемые строки.

Корректный поиск от‑воротов по‑русски – это вопрос согласованности кодировок на всех уровнях: от физического хранения данных до отображения в редакторе запросов. Следуя рекомендациям, приведённым в этой статье, вы избавитесь от «кракозябр», обеспечите стабильную работу поисковых функций и упростите поддержку проекта.

Если после выполнения всех шагов проблема сохраняется, проверьте логи сервера MySQL (включите general_log) и убедитесь, что запрос действительно приходит в нужной кодировке.

Удачной разработки!