mysqldump и кодировка
Victor Sudakov написал(а) к Eugene Grosbein в Sep 17 09:34:22 по местному времени:
Dear Eugene,
07 Sep 17 16:02, you wrote to me:
EG> Это обычное дело, когда приложения создают базы данных/таблицы,
EG> не специфицируя кодировку и наследуя системный дефолт, который
EG> у тебя может быть совсем не тот, что был у разработчика приложения.
Странно, что разработчику пофиг, что это может привести к проблемам в приложении, из-за неправильного collation.
EG> В итоге данные лежат фактически в одной кодировке, а MySQL думает,
EG> что в другой.
Так и есть в моем случае. Просто у меня было мнение (как объяснили на канале #freebsd, ошибочное), что mysqldump должен сливать сырые данные, как они есть в базе. А оказывается он смотрит на клиентскую кодировку и пытается данные перекодировать из кодировки, указанной для таблицы, в кодировку клиента (из .my.cnf или аналогичного места). Это был ключевой момент в понимании, что же собственно происходит.
EG> Вот это "думает" можно достаточно легко увидеть,
EG> как и системные дефолты:
mysql>> show variables like 'char%';
mysql>> show variables like 'collation%';
EG> Их легко поменять в my.cnf, но это не повлияет на "уже кривые"
EG> таблицы. Для их починки гарантированно работает такой путь:
EG> 1) При помощи show table status \G и/или show create table/mysqldump
EG> выяснить, что думает MySQL о кодировке данных. Затем снова сдампить
EG> данные при помощи:
EG> mysqldump --create-options --skip-set-charset
EG> --default-character-set=latin1, где вместо latin1 подставить
EG> кодировку, которая приписана к данным в таблицах - таким образом,
EG> получим дамп без перекодированных данных (бнопни), но с неправильной
EG> кодировкой в CREATE TABLE, которую затем меняем тупо sed-ом в дампе.
Так и сделал в конечном итоге.
IMНO более правильно было бы наличие у mysqldump ключа "ничего не перекодировать, слить как есть", но такого ключа не нашлось.
С помощью --default-character-set можно примерно этого добиться, но если не дай Бог в разных таблицах/базах оказались разные "SET CНARSET", то получается геморрой.
Victor Sudakov, VAS4-RIPE, VAS47-RIPN
--- GoldED+/BSD 1.1.5-b20160322-b20160322
|