PDA

Просмотр полной версии : Пролюбил кодировку MySQL


ntldr
31.01.2010, 00:34
Дело было так. Когда я взял хост там была latin1, сервер писал в базу с кодировкой цп1251. Потом я "перевел" как мне казалось, в utf8_general_ci. Но в действительности оно только сделала из нормального цп1251, битый цп1251, то есть приписала лишний байт к нему. То есть сейчас символы в базе хранятся так:
1 левый байт - 1 цп1251'шный

В общем как обычно поступают в подобных случаях?

mailbrush
31.01.2010, 00:41
Восстанавливать БД из дампа, если таковой был.

ntldr
31.01.2010, 00:57
Восстанавливать БД из дампа, если таковой был.
меня интересуют способы фикса такой ломанной кодировки. Ведь информация то цела, просто немного обфусцирована ;)

Gifts
31.01.2010, 01:29
ntldr Вернуть обратно latin1 не пробовали (теми же действиями, которыми превращали в utf8)? Такое кривое преобразование произошло из-за того, что однобайтовая кодировка latin1 соответствует как раз утф в виде "левый байт"+байт latin1. Обратное преобразование должно пройти нормально

Не забудьте сохранить текущий дамп ^^

ntldr
31.01.2010, 05:29
ntldr Вернуть обратно latin1 не пробовали (теми же действиями, которыми превращали в utf8)? Такое кривое преобразование произошло из-за того, что однобайтовая кодировка latin1 соответствует как раз утф в виде "левый байт"+байт latin1. Обратное преобразование должно пройти нормально

Не забудьте сохранить текущий дамп ^^
да, в принципе получилось, но только на отдельной таблице. Всю базу не получается перекодировать :(

imajo.ati
02.02.2010, 00:33
да, в принципе получилось, но только на отдельной таблице. Всю базу не получается перекодировать :(
а возможно ли текстовый дамп бд перекодировать скриптом? к примеру по регулярному выражению найти все места `field`= 'wrong_data' и с wrong_data сделать манипуляцию?

ntldr
02.02.2010, 14:23
а возможно ли текстовый дамп бд перекодировать скриптом? к примеру по регулярному выражению найти все места `field`= 'wrong_data' и с wrong_data сделать манипуляцию?
не понял мысли, но зато у меня появилась идея. Написать скрипт который будет делать селект, затем иконв и апдейт в новую базу. Попробую так

ntldr
02.02.2010, 19:43
в общем у меня получилось из mysql выдрать дамп в чистом цп1251 и перевести его в utf-8. проверял браузером)) он все верно отображал в utf-8. Ho при импорте дампа через утилиту mysql - получаются "иероглифы". Втф?

Gifts
02.02.2010, 19:53
ntldr При создании таблиц из дампа - указана неправильная кодировка. CREATE TABLE `dedyki` (
тратата описание таблицы
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ntldr
02.02.2010, 20:02
ntldr При создании таблиц из дампа - указана неправильная кодировка. CREATE TABLE `dedyki` (
тратата описание таблицы
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

дело в том что при создании из дампа у меня уже стоял utf8.
Мб играет роль некое "Сопоставление соединения с MySQL:" которое равно utf8_unicode_ci заместо utf8_general_ci?

imajo.ati
02.02.2010, 20:38
Ho при импорте дампа через утилиту mysql - получаются "иероглифы". Втф?
через mysql administrator? там квадратики вместо данных? это только отображается так криво, импорт пройдёт нормально, уже не раз сталкивался.

ntldr
02.02.2010, 20:40
через mysql administrator? там квадратики вместо данных? это только отображается так криво, импорт пройдёт нормально, уже не раз сталкивался.
нет через консольный mysql. Просто у меня тестовая база с которой я сразу начал нормально работать, там русские буквы идеально отображаются

ntldr
03.02.2010, 15:59
Получилось.
1)Посмотрев в 16-ричном виде я узнал что MySQL отдает результаты в обычном цп1251
2)Сдампил бд:
mysqldump -u root -ppassword --default-character-set=latin1 --skip-set-charset baza > dump.sql
3)Перевел из цп1251 в утф8
iconv -f CP1251 -t UTF-8 -o test1.sql dump.sql
4)Залил обратно в бд дамп в утф8
mysql --default-character-set=utf8 -u root -ppassword -D baza < test1.sql
5)PROFIT