Кодировки MySQL при восстановлении дампа
Что важно знать
Коротко о терминах:
- client — программа или скрипт, который подключается к серверу MySQL.
- connection — параметры, согласованные при установке соединения (включая ожидаемую кодировку).
- collation — правила сравнения и сортировки строк (не влияет на кодировку при отправке данных).
MySQL получает и отдаёт данные в кодировке, согласованной на соединении. Если при подключении ожидается utf8, сервер будет принимать и отдавать utf8-строки; при необходимости MySQL сам конвертирует данные внутри. Поэтому для успешного восстановления дампа достаточно обеспечить, чтобы кодировка файла дампа совпадала с кодировкой соединения клиента и сервера.
Important: настройка collation не решит проблемы с «умляутами» или неправильной кодировкой при импорте — она только управляет сортировкой и правилами сравнения.
Почему проблема возникает и как MySQL работает с кодировками
Когда вы делаете дамп и затем восстанавливаете его на другой сервер, два фактора критичны:
- Какая кодировка стоит по умолчанию на новом сервере (character_set_connection / character_set_client). Эта информация видна в MySQLDumper и в самом MySQL.
- В какой кодировке сохранён ваш дамп.
Если эти кодировки совпадают — импорт пройдёт без проблем. Если нет — возникает несоответствие, и тексты будут выглядеть искажённо.
Пример поведения сортировки (это про collation, не про кодировку):
Таблица с тремя строками (колонка Name):
- 1 Zapp, Frank
- 2 Zäppel, Ernst
- 3 Zander, Bernd
ORDER BY Name с collation latin1_german1_ci (dictionary) даст: Zander, Zappa, Zäppel. С latin1_german2_ci (phonebook) — Zäppel, Zander, Zappa. Это показывает, что collation влияет на порядок, но не решает кодировочные ошибки.
Как определить кодировку сервера
В интерфейсе MySQLDumper: Home / MySQL-Variables / Variables — ищите character_set_client и character_set_connection.
Если вы работаете напрямую с MySQL, выполните:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';В результате вы увидите, какие кодировки и сопутствующие параметры установлены на сервере.
Практическая пошаговая инструкция для восстановления дампа
- Скачайте дамп, созданный MySQLDumper. Если файл сжат (*.sql.gz), распакуйте его (gunzip, 7-Zip и т. п.).
- Проверьте кодировку файла. Если вы не уверены, попробуйте открыть файл в текстовом редакторе, который показывает кодировку (Notepad++, Visual Studio Code, Sublime Text).
- Если кодировка файла совпадает с character_set_connection сервера — импортируйте напрямую. Например:
mysql --default-character-set=utf8 -u user -p database < dump.sqlЗамените utf8 на нужную кодировку, если сервер ожидает другую.
- Если кодировка файла не совпадает, перекодируйте файл в нужную кодировку. Два варианта:
- Использовать iconv (CLI):
iconv -f OLD_ENCODING -t NEW_ENCODING dump.sql > dump-converted.sqlПример:
iconv -f latin1 -t utf8 dump.sql > dump-utf8.sql- Или открыть файл в редакторе и сохранить в нужной кодировке без BOM:
- Notepad++: Кодировки → Кодировать в UTF-8 без BOM → Сохранить.
- TextPad / VS Code: File → Save As → выбрать нужную Encoding.
После перекодировки (если файл был распакован, заново запакуйте, если нужно) загрузите файл на сервер и импортируйте через MySQLDumper или напрямую через mysql, указав –default-character-set.
Проверка после восстановления: выполните выборки и осмотрите строки с иностранными символами. Проверьте количество записей (SELECT COUNT(*)) и несколько контрольных строк.
Команды и примеры
- Просмотр настроек в MySQL:
SHOW VARIABLES LIKE 'character_set_client';
SHOW VARIABLES LIKE 'character_set_connection';- Установка кодировки для текущего соединения (вручную):
SET NAMES 'utf8';- Импорт дампа, принудительно указав кодировку клиента:
mysql --default-character-set=utf8 -u user -p database < dump.sql- Перекодировка файла через iconv:
iconv -f latin1 -t utf8 dump.sql > dump-utf8.sql- Работа с gzip на *nix:
gzip dump.sql # создаст dump.sql.gz
gunzip dump.sql.gz # распакуетНа Windows вы можете использовать 7-Zip для упаковки/распаковки, но обращайте внимание на правильную распаковку без повреждений — старые версии архиваторов иногда дают проблемы с корректной распаковкой текстовых файлов.
Когда описанный подход не сработает (примеры и исключения)
- Файл уже был «двойно закодирован» (double-encoded). Это случай, когда текст сначала был сохранён в одной кодировке, а потом неправильно переконвертирован и сохранён снова. В таких случаях простая перекодировка может усугубить проблему; нужна диагностика и, возможно, восстановление из оригинального источника.
- Двоичные поля (BLOB) или файлы, в которых часть содержимого не текстовая — их нельзя просто перекодировать как текст.
- Дамп был создан программой, которая вставляет управляющие последовательности или изменяет байтовый порядок; тогда нужно понять формат и корректно извлечь SQL.
Если вы не уверены в состоянии дампа — сделайте тестовую базу и импортируйте туда файл, прежде чем трогать боевой сервер.
Альтернативные подходы
- Попросить исходный сервер экспортировать дамп в требуемой кодировке (если есть доступ). Например, mysqldump поддерживает параметр –default-character-set.
- Использовать промежуточный сервер/контейнер с той же конфигурацией и импортировать дамп туда, затем сделать новый экспорт уже в нужной кодировке.
- Программно читать дамп и корректировать проблемные строки через скрипты (Python, Perl) с явной детекцией и конверсией кодировок.
Руководство для ролей (чек-листы)
Администратор БД:
- Проверить character_set_client и character_set_connection на целевом сервере.
- Сообщить разработчикам/операторам требуемую кодировку (например, utf8/utf8mb4).
- Резервная копия текущей базы перед импортом.
Разработчик / Оператор импорта:
- Проверить кодировку дампа с помощью текстового редактора или утилиты file/enca.
- При необходимости перекодировать через iconv или редактор.
- Импортировать с указанием –default-character-set.
- Выполнить контрольные выборки и сверку количества строк.
Критерии приёмки
- Все текстовые поля с иностранными символами отображаются корректно.
- Количество записей до и после восстановления совпадает.
- Критические запросы работают без ошибок, связанные с кодировкой.
Мини-методология (быстрый план действий)
- Определите кодировку сервера (MySQLDumper / SHOW VARIABLES).
- Проверяйте кодировку файла дампа.
- При необходимости — перекодируйте файл в кодировку сервера или укажите её при импорте.
- Тестируйте на копии базы.
Советы и эвристики
- Если сервер современный и вы планируете поддержку полноценной Юникод-совместимости — используйте utf8mb4 для текста и collation, совместимую с ним.
- Если не знаете исходную кодировку, пробуйте common candidates: utf8, latin1. Делайте тесты на копии.
- Никогда не применяйте массовые операции на боевой базе без резервной копии.
Примеры диагностики: тесты и приёмочные кейсы
- Тест 1: импорт дампа в тестовую БД, проверить визуально 10 строк с диакритикой.
- Тест 2: сравнить контрольную сумму (например, md5sum) для ключевых текстовых полей до экспорта и после импорта (при доступе к исходной БД).
- Тест 3: выполнить SELECT … WHERE field LIKE ‘%тест%’ для строк с национальными символами — убедиться, что поиск работает ожидаемо.
Краткая галерея крайних случаев
- Файл в кодировке CP1252, сервер ожидает utf8 — результат: «кракозябры».
- Файл уже в utf8, но сервер инициализирован под latin1 — возможны искажения.
- Данные «умляутов» выглядят корректно, но сортировка неверная — это задача collation, а не кодировки.
Однострочные определения (глоссарий)
- character_set_client — кодировка, в которой клиент шлёт данные серверу.
- character_set_connection — кодировка, согласованная на начале соединения (включает client/ results/ database).
- collation — правила сравнения и сортировки строк.
Итог
Чтобы успешно восстановить дамп на другом сервере, убедитесь, что кодировка файла соответствует кодировке соединения/сервера. Если не совпадает — перекодируйте файл или укажите кодировку при импорте. Collation не лечит проблемы кодировки; оно нужно для правильной сортировки и сравнения.
Notes: начав с версии 1.21b12 MySQLDumper стал использовать utf8 как стандарт для своих дампов, но при восстановлении всё равно ориентируйтесь на текущие настройки сервера и кодировку источника.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента