Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Пролюбил кодировку MySQL (https://forum.antichat.xyz/showthread.php?t=174913)

ntldr 31.01.2010 00:34

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

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

mailbrush 31.01.2010 00:41

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

ntldr 31.01.2010 00:57

Цитата:

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

меня интересуют способы фикса такой ломанной кодировки. Ведь информация то цела, просто немного обфусцирована ;)

Gifts 31.01.2010 01:29

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

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

ntldr 31.01.2010 05:29

Цитата:

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

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

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

imajo.ati 02.02.2010 00:33

Цитата:

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

а возможно ли текстовый дамп бд перекодировать скриптом? к примеру по регулярному выражению найти все места `field`= 'wrong_data' и с wrong_data сделать манипуляцию?

ntldr 02.02.2010 14:23

Цитата:

Сообщение от imajo.ati
а возможно ли текстовый дамп бд перекодировать скриптом? к примеру по регулярному выражению найти все места `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

Цитата:

Сообщение от Gifts
ntldr При создании таблиц из дампа - указана неправильная кодировка.
Код:

CREATE TABLE `dedyki` (
тратата описание таблицы
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


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

imajo.ati 02.02.2010 20:38

Цитата:

Сообщение от ntldr
Ho при импорте дампа через утилиту mysql - получаются "иероглифы". Втф?

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

ntldr 02.02.2010 20:40

Цитата:

Сообщение от imajo.ati
через 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


Время: 03:58