Если после восстановления MySQL базы вместо русских или украинских букв появились знаки вопроса, почти всегда проблема связана с кодировкой. Самое важное - не импортировать один и тот же дамп снова и снова поверх той же базы, пока не понятно, на каком этапе текст был поврежден.

Сначала проверьте, не испорчен ли сам бэкап

Откройте SQL-дамп в редакторе, который нормально работает с UTF-8: например VS Code, Notepad++ или другом редакторе кода. Найдите слово, где должны быть русские или украинские буквы.

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

Какая кодировка нужна для современных сайтов

Для современных сайтов рекомендуем использовать UTF-8, а в MySQL - utf8mb4. Эта кодировка корректно хранит кириллицу, украинские буквы и emoji. Смешивание старых кодировок вроде cp1251 с UTF-8 часто приводит к проблемам после переноса.

Что проверить в phpMyAdmin

  1. Откройте phpMyAdmin и выберите нужную базу данных.
  2. Проверьте сравнение базы и таблиц. Для большинства современных сайтов оно должно быть похоже на utf8mb4_unicode_ci или utf8mb4_general_ci.
  3. Откройте одну из проблемных таблиц и посмотрите, поврежден ли текст уже внутри таблицы.

Восстановите базу заново с правильной кодировкой

Если в дампе текст читается нормально, создайте пустую базу и импортируйте дамп заново. Не импортируйте его в базу, где уже лежат поврежденные таблицы.

При импорте через SSH можно явно указать кодировку:

mysql --default-character-set=utf8mb4 -u USER -p DATABASE < database.sql

Если старый дамп был создан в кодировке Windows-1251, лучше не угадывать. Укажите это поддержке или аккуратно конвертируйте дамп перед импортом.

Проверьте конфигурацию сайта

Сайт должен подключаться к MySQL в той же кодировке, в которой хранится база. Для современного PHP-кода используйте utf8mb4.

// mysqli
$mysqli->set_charset('utf8mb4');

// PDO
new PDO('mysql:host=localhost;dbname=DATABASE;charset=utf8mb4', $user, $password);

Старые примеры с mysql_query() уже не стоит использовать: расширение mysql удалено из актуальных версий PHP.

Если текст уже поврежден

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

Что отправить в поддержку

Укажите имя базы, CMS сайта, имя файла дампа, примерную дату бэкапа и пример страницы или таблицы, где текст отображается неправильно. Если знаете, сообщите также, в какой кодировке работал старый сайт: UTF-8 или Windows-1251.