Показать сообщение отдельно
  #9  
Старый 08.09.2017, 07:10
Victor Sudakov
Guest
 
Сообщений: n/a
По умолчанию 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
Ответить с цитированием