Добро пожаловать, Гость. Пожалуйста авторизуйтесь здесь.
FGHIGate на GaNJa NeTWoRK ST@Ti0N - Просмотр сообщения в эхоконференции RU.UNIX.BSD
Введите FGHI ссылку:


Присутствуют сообщения из эхоконференции RU.UNIX.BSD с датами от 18 Jan 11 22:51:00 до 27 May 24 11:30:58, всего сообщений: 10756
Ответить на сообщение К списку сообщений Предыдущее сообщение Следующее сообщение
= Сообщение: 5973 из 10756 ===================================== RU.UNIX.BSD =
От   : Victor Sudakov                   2:5005/49          08 Sep 17 09:34:22
Кому : Eugene Grosbein                                     08 Sep 17 09:34:22
Тема : mysqldump и кодировка
FGHI : area://RU.UNIX.BSD?msgid=2:5005/49+59b2047e
На   : area://RU.UNIX.BSD?msgid=grosbein.net+71d78b2c
= Кодировка сообщения определена как: CP866 ==================================
==============================================================================
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-ом в дампе.

Так и сделал в конечном итоге.

IMHO более правильно было бы наличие у mysqldump ключа "ничего не перекодировать, слить как есть", но такого ключа не нашлось.

С помощью --default-character-set можно примерно этого добиться, но если не дай Бог в разных таблицах/базах оказались разные "SET CHARSET", то получается геморрой.


Victor Sudakov, VAS4-RIPE, VAS47-RIPN
--- GoldED+/BSD 1.1.5-b20160322-b20160322
* Origin: Ulthar (2:5005/49)

К главной странице гейта
Powered by NoSFeRaTU`s FGHIGate
Открытие страницы: 0.127088 секунды