Если после восстановления 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.

Правила бэкапа базы данных

  • Экспортируйте базу перед обновлениями CMS, импортами и search-replace.
  • Для больших баз phpMyAdmin может упереться в лимиты; используйте серверные инструменты или обратитесь в поддержку.
  • Проверяйте кодировку и collation, если сайт использует кириллицу.
  • Бэкап файлов без базы - не полный бэкап WordPress, Joomla или OpenCart.

Практический чеклист по MySQL

БлокЧто проверить
БэкапыДля CMS сохраняйте и файлы, и базу. Копия файлов без базы не является полным бэкапом сайта.
ПользователиПо возможности используйте отдельных пользователей баз и не давайте одному пользователю доступ ко всем базам.
КодировкаДля кириллицы проверяйте UTF-8/utf8mb4 до импорта и экспорта, чтобы не получить знаки вопроса.
ПроизводительностьМедленные запросы, разросшиеся таблицы и отсутствие индексов могут замедлять весь сайт.
Если не уверены, какая инструкция подходит именно к вашей ситуации, пришлите домен, скриншот и что уже пробовали. Поможем выбрать правильный путь в чате. открыть чат.
Короткий маршрут чтения

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