Как установить кодировки перед началом работы mysqldump

Drakon

Новичок
Как установить кодировки перед началом работы mysqldump

Имеется виртуальный хостинг на sweb.ru. На нём есть БД в utf8, которую надо сдампить в utf8-файл.
Если дампить её через mysqldump, то дампится в cp1251, т. к. настроено там всё следующим образом (переменные запрашивались находясь в БД, которую надо сдампить):

Код:
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | cp1251                     | 
| character_set_connection | cp1251                     | 
| character_set_database   | utf8                       | 
| collation_connection     | cp1251_general_ci          | 
| collation_database       | utf8_general_ci            | 
| collation_server         | cp1251_general_ci          | 
| character_set_filesystem | binary                     | 
| character_set_results    | cp1251                     | 
| character_set_server     | cp1251                     | 
| character_set_system     | utf8                       | 
| init_connect             | SET NAMES cp1251           | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+
База данных и все её таблицы хранятся в utf8...
Т. е. если сделать SET NAMES 'utf8' то всё отлично отображается.

Возможно-ли как-то перед началом работы mysqldump выполнить SET NAMES 'utf8' либо, что аналогично, установить переменные:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
???

Если прописать --default-character-set=utf8 для mysqldump, тоже не помогает.
Если прописать в ~/.my.cnf
Код:
[mysql]
default-character-set=utf8

[client]
character_set=utf8

[mysqldump]
character_set=utf8
- аналогично, не помогает...


P. S.
Дампить в 1251, а потом конвертировать через iconv в utf8 не могу, т. к. некоторые таблицы хранят бинарные данные и iconv просто не хочет конвертировать такой дамп.
 

vovanium

Новичок
Можешь дампер использовать, он автоматом переключает кодировки для каждой таблицы при бэкапе/восстановлении.
 

Drakon

Новичок
В техподдержке ответили следующее:

в данном случае только один вариант делать дамп в нужной кодировке, если вы
поставите себе локально какой либо mysql клиент и будете подключаться к базе
на нашем сервере, тогда вы сделаете себе дамп без проблем.
О sypex-дампере давно знаю, он справится с этой задачей... Но его всегда считал последним решением, которое буду использовать. Мне вообще в итоге надо получить систему перекачки резервных копий сайта на мой комп, поэтому адаптировать sypex к этой задаче не очень хочется.

Вообще если возиться с mysqldump, можно просто в исходники забить выполнение запроса SET NAMES 'utf8' перед началом работы, но это может обойтись по времени дороже, чем использовать sypex.

А помимо mysqldump есть какие-нить альтернативы? Или может кто-то уже переделылвал mysqldump под такую задачу - где это можно посмотреть?
 

Фанат

oncle terrible
Команда форума
Вообще если возиться с mysqldump, можно просто в исходники забить выполнение запроса SET NAMES 'utf8' перед началом работы, но это может обойтись по времени дороже, чем использовать sypex.
а указать кодировку в параметрах Аллах не дозволяет?
 

Drakon

Новичок
Пробовал вот такую команду:

Код:
mysqldump -u ИМЯ_ПОЛЬЗОВАТЕЛЯ --password=ПАРОЛЬ --default-character-set=utf8 --set-charset БАЗА ТАБЛИЦА > dump.sql
Не помогло.

Но вообще по документации --set-charset не выполняет команду SET NAMES перед работой, а просто добавляет в дамп строчку SET NAMES '...': http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_set-charset
 

vovanium

Новичок
Drakon
Да это я перепутал. Загадочный глюк, --default-character-set должен менять кодировку.
 

vovanium

Новичок
Фaнат
Похоже, но я к примеру пробовал на локалке, и mysqldump'у init_connect не мешал абсолютно. Хотя возможно зависит от версии.
 

vovanium

Новичок
Фaнат
на локалке рутом небось пробовал?
А какая разница, что init_connect для рута по другому работает?
А пробовал и по рутом, и под обычным юзером, без разницы, какую кодировку укажешь в параметрах такая и будет. Муська 5.1.37 на Висте.
 

vovanium

Новичок
Фaнат
Очень ценный комментарий... Вообще init_connect в случае свежей версии mysqldump не очень важен, т.к. mysqldump постоянно переключает кодировки в процессе работы, структуру таблицы он дампит в binary, а для дампа данных переключается в кодировку указанную в параметрах или utf8.
 

Фанат

oncle terrible
Команда форума
пойди скажи это авторам документации
а то они не знают
 

vovanium

Новичок
Фaнат
Ну да ты прав насчет того что под рутом init_connect не выполняется (просто не юзаю я его, не знал тонкостей).
Но я был прав, что он не влияет на mysqldump (актуальной версии). Вот лог запросов
[sql]SET NAMES cp1251;
Init DB temp2;
show tables;
show table status like 'ob\_adm\_logs';
SET SESSION character_set_results = 'binary';
show create table `ob_adm_logs`;
SET SESSION character_set_results = 'utf8';
show fields from `ob_adm_logs`;
SELECT /*!40001 SQL_NO_CACHE */ * FROM `ob_adm_logs`;[/sql]
часть запросов выкинул (блокировка таблиц и т.п.). Как видишь пока mysqldump доходит до данных он дважды меняет кодировку.
 

MiksIr

miksir@home:~$
Вот может не по теме, но скажите... вот два мускуля, отличаются минорной цифрой. Делается дефаултный mysqldump ... ну почему он не восстанавливается корректно на другой базе? Почему нужны пляски с бубнами (ключами или грепами), что бы кодировка не цокалась? Я с мускулем не очень - мож там какие-то неразрешимые глобалные проблемы - поместить в дамп всю информацию?
 

Фанат

oncle terrible
Команда форума
круто блин, не знал.
по ходу, теперь ситуация топикстартера реверсно отинжинирена полностью
 

vovanium

Новичок
MiksIr
Вообще проблема в том, что люди не знают как в mysql правильно пользоваться кодировками. Если бы в mysql сделали чтобы по умолчанию нужно было принудительно кодировку указывать при соединении, тогда думаю проблем меньше было.
А так дефолтная кодировка latin1 (которая подходит в принципе для большинства импортных сайтов), и люди тупо заливают в неё cp1251. Mysqldump дампит в универсальной utf8, и соответственно пытается преобразовать данные в utf8, но по правилам latin1... Сталкивался даже с запущенными случаями когда в таблице latin1 часть данных была в cp1251, а часть в utf8.
 

Drakon

Новичок
Ну так как решать проблему? Никаких альтернатив нету, кроме как модернизировать mysqldump?
 

vovanium

Новичок
Drakon
Ну ты бы хоть сказал какие версии софта используешь. Т.к. алгоритм работы текущей версии mysqldump появился относительно недавно (не скажу точно когда), но менялся он довольно сильно именно из-за работы с кодировками.
 
Сверху