заметки на полях

Блокнот разработчика

mysqldump и проблемы с кодировкой

Делая дамп совершенно обычным способом

1
mysqldump ads -u <user> -p > dump.sql

Заметил маленькую неприятность, что дамп получается со сбитыми кодировками. Добавление к параметра

--default-character-set=utf8

облегчения не принесло и не возымело надо сказать вообще никакого эффекта. После небольшого периода гугления выяснилось, что дело не в утилите mysqldump, а в настройках кодировок на сервере. Посмотрев текущие значения:

1
mysql> show variables;

Понял что нужно лезть в конфиг сервера. В раздел глобальных параметров файла

/etc/mysql/my.cnf

необходимо добавить что то вроде:

1
2
3
4
5
6
7
[mysqld]

default-character-set = utf8
character_set_server = utf8
character_set_client = utf8
collation_server = utf8_general_ci
skip-character-set-client-handshake

Параметры которые могут понадобиться при этом:

  • character_set_client

    – кодировка, в которой данные будут поступать от клиента

  • character_set_connection

    – кодировка по умолчанию для всего, что в рамках соединения не имеет кодировки

  • character_set_database

    – кодировка по умолчанию для баз

  • character_set_filesystem

    – кодировка для работы с файловой системой (LOAD DATA INFILE, SELECT … INTO OUTFILE, и т.д.)

  • character_set_results

    – кодировка, в которой будет выбран результат

  • character_set_server

    – кодировка, в которой работает сервер

  • character_set_system

    – кодировка, в которой задаются идентификаторы MySQL, всегда UTF8

  • character_sets_dir

    – папка с кодировками

  • skip-character-set-client-handshake

    – игнорировать клиентские настройки кодировки

Но не смотря на правильную установку кодировок и сравнения для таблиц и строк данные писались в latin1. Это можно было определить по битому дампу. Решить можно довольно просто и в лоб – делаем дамп в latin1:

1
mysqldump --default-character-set=latin1 --skip-set-charset -u <user> -p > b.sql

Таким образом мы получаем правильный дамп, т.к. кодировка полученного sql будет UTF, с помощью параметра 

--default-character-set=latin1

мы сдампили данные в той кодировке в которой они и была добавлены (когда сервер брал кодировки по умолчанию) и убрали упоминания об этом с помощью аттрибута

--skip-set-charset

Осталось развернуть базу и можно пользоваться уже с новой кодировкой.

Интересные материалы по теме

MySQL + кодировки

MySQL 5.1 Reference Manual – Server System Variables

Как правильно делать backup базы данных сайта

Tags: ,

Leave a Reply