mysqldump и проблемы с кодировкой
Делая дамп совершенно обычным способом
1 | mysqldump ads -u <user> -p > dump.sql |
Заметил маленькую неприятность, что дамп получается со сбитыми кодировками. Добавление к параметра
--default-character-set=utf8
облегчения не принесло и не возымело надо сказать вообще никакого эффекта. После небольшого периода гугления выяснилось, что дело не в утилите mysqldump, а в настройках кодировок на сервере. Посмотрев текущие значения:
1 |
Понял что нужно лезть в конфиг сервера. В раздел глобальных параметров файла
/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
Осталось развернуть базу и можно пользоваться уже с новой кодировкой.