На этот раз попалась такая экзотика как база в кодировке latin1 c collation latin1_bin. Это уже третий пост (первый и второй) на тему latin1 и чувствую не последний, т.к. криворукость хостеров не знает границ:
Вчера я часа 3 мучался на своем сервере импортировал дамп этой базы и так и сяк, но максимум чего удавалось добиться это вернуть все на 90%, с пропажей всех кириллических букв С, Я и еще какой то, уже не помню.
Загружать базу пробовал и phpmyadmin’ом и скриптом bigdump и в консоле сервера с разными командами. Ничего не помогало.
Сегодня утром решил продолжить изыскания:
Мне предоставили доступ к панели хостинга где была эта «кривая» база, где я нашел базу в формате файлов базы mysql (fmt myd myi) и скачал все файлы локально. При просмотре файлов в LISTER’е тоталкомандера увидел что русские буквы там читабельны при установке кодировки просмотра в utf8.
Скачал набор topserver чтобы настроить рабочую среду на компьютере. Можно и Денвер или другой аналог. Этот мне посоветовали недавно, сам ранее не пользовался никакими наборами. Все работает там без всяких танцев с бубнами и быстро.
Изменил настройки мускула в My.cnf везде прописав кодировку latin1 и collation latin1_bin
Создал пользователя и базу с нужным названием
Закачал в папку «сайта» голый движок WP2.3.3 (можно и 2.5.* и любой другой под который у вас сделана база)
Скопировал все файлы базы mysql в директорию новой базы (название директории в папке данных мускула соответствуют названию базы). В винде и линуксе это одинаково. Про bsd не знаю (не работал в ней). Конечно можно попробовать и просто импортировать дамп с кривой базой, но не факт что фишка прокатит. Хотя с перенастроенным мускулом может быть и заработало бы. Проверять не стал.
Далее в конфиге WP я прописал жестко кодировку latin1 вместо utf8 как там есть изначально. Вуаля, сайт отображается корректно на русском. Мы своего добились и дальше действуем по схеме, которую я описывал более года назад, см ниже.
Экспортируем базу при текущих настройках, не забыв выделить все нужные таблицы.
Полученный дамп уже в корректной кодировке utf-8 и нормально открывается редактором utf8
Делаем поиском и заменой: 1) COLLATE=latin1_bin меняем на пустое место (удаляем вообще). 2) CHARSET=latin1 меняем на CHARSET=utf8. 3) collate latin1_bin меняем также на пустое место (удаляем вообще)
Сохраняем файл в кодировке utf-8
Убеждаемся еще раз в каком нибудь LISTER’е от тоталкомандера что в режиме utf8 у нас все великолепно читается
Заходим в phpmydmin (уже на сервере, а не на локалхосте) и удаляем все таблицы в базе. После этого на закладке ОПЕРАЦИИ меняем сравнение с latin1_bin на utf8_general_ci
Импортируем новый правильный дамп базы через phpmyadmin в эту пустую базу
В wp-config.php меняем слово latin1 на utf8
Радуемся жизни дальше :-)
Если что то не получилось, то просматриваем все пункты по порядку еще раз. Также нужно учесть что файлы более 3мб редактор unicedit не очень любит и может ругаться на память, но после выдавания ошибки все работает дальше. Поэтому если это возможно то дамп БОЛЬШИХ таблиц делайте отдельным файлом.
Если вы сами не в состоянии справитсья с проблемой, то я могу это сделать за скромную сумму 10wmz(250руб) (webmoney|яндекс.деньги|на мобильник). Контакты найдете здесь на сайте.
PS а вот и сайт, на котором была проблема с кодировкой. Загляните, интересные ролики.
Рецепт как перекодировать все таблицы в базе для WP в нужную кодировку при условии что русские буквы по какимто причинам отображаются не так как надо. :)
Маленький комментарий от этого конкретного хостинга,
который заключается в том, что клиент сам при создании базы выбирает кодировку. Для PHP 4 несколько лет назад это был лучший вариант.
Сейчас такую базу на нашем хостинге создать можно только долго и неправильно выбирая параметры.
Маленький комментарий от этого конкретного хостинга,
Стоит FAQ на хостинге обновить наверное. И написать подробнее про смену кодировок, чтобы пользователи потом не страдали. И как вообще повлиять могло то что обновили РАБОТАЮЩУЮ систему wp2.3.3 до 2.5.1 и при этом умерла кодировка, хотя на всех хостингах даже с кодировкой win1251 все происходит в большинстве случаев нормально. А с latin1 одни проблемы и не только в WP. Ко мне уже обращались люди с просьбой восстановить из этой «хорошей» кодировки свои базы сайтов. Отсюда и столько разных способов появилось о которых я периодически пишу здесь, т.к. каждый отдельный случай может отличаться. Досточно погуглить на тему latin1 utf8 чтобы понять что проблема масштабна и реально описаний как все исправить почти нет
1GB вообще странный хостинг — годится только для сайтов-визиток с посещаемостью стремящейся к нулю.
Там много к чему претензии можно иметь, кодировка БД даже не во главе списка.
До сих пор с ужасом вспоминаю как делал подобное для базы инвиженовского форума… правда мне попался еще более сложный случай потому что в базу латин писался уникод который реально был текстом в koi8-r :) сидел и вручную дамп конвертил :)
раздули проблему, если данные реально представляют ценность то, все эти процедуры можно сделать за очень и очень скромную сумму у профи…
некоторых жаба давит (вспоминая как один тут давно просил помочь переделать ему базу галереи одной), но нахаляву вообще а потом еще и возмущался тут и на форуме галереи что его послали
До сих пор с ужасом вспоминаю как делал подобное для базы инвиженовского форума… правда мне попался еще более сложный случай потому что в базу латин писался уникод который реально был текстом в koi8-r :) сидел и вручную дамп конвертил :)
Интересно, а если дамп занимает 100-200 Мб то задача не решаема? :)
Только что отконвертил базу слитую чарез phpmyadmin. Поля с дефолтной кодировкой — latin1, в которые данные писались в ср1251 и естественно крокозяблы а не дамп. Решилось все очень просто
cat db_duml.sql |iconf -c -f utf-8 -t latin1 > db_dump_iso.sql возвращием дамп в исходное состоянии, т.к. mysql считает что данные хранятся в латин1 а кодировка клиента(ПХП) — utf-8 и естественно не правильно их конвертит
cat db_dump_iso.sql |iconv -c -f latin1 -t cp1251 |replace «latin1» «cp1251» > dump_cp.sql конвертим в cp1251 и заменяем в дампе латин1 на cp1251
после этого в начало файла дампа добавляем запись SET NAMES cp1251;
При необходимости в скриптах после mysql_connect() mysql_select_db() добавляем mysql_query(‘SET NAMES cp1251’)
Наверно все таки не криворукость хостеров ключевой момент
респект!
извращенцы
Респект!
пока существует куча кодировок, с ними буду проблемы. выход один — прийти к власти и запретить все нах кроме одной (:
Наверное уже стоит базу проблематичных хостеров создавать, которые такие подарки могут преподнести.
Маленький комментарий от этого конкретного хостинга,
который заключается в том, что клиент сам при создании базы выбирает кодировку. Для PHP 4 несколько лет назад это был лучший вариант.
Сейчас такую базу на нашем хостинге создать можно только долго и неправильно выбирая параметры.
Стоит FAQ на хостинге обновить наверное. И написать подробнее про смену кодировок, чтобы пользователи потом не страдали. И как вообще повлиять могло то что обновили РАБОТАЮЩУЮ систему wp2.3.3 до 2.5.1 и при этом умерла кодировка, хотя на всех хостингах даже с кодировкой win1251 все происходит в большинстве случаев нормально. А с latin1 одни проблемы и не только в WP. Ко мне уже обращались люди с просьбой восстановить из этой «хорошей» кодировки свои базы сайтов. Отсюда и столько разных способов появилось о которых я периодически пишу здесь, т.к. каждый отдельный случай может отличаться. Досточно погуглить на тему latin1 utf8 чтобы понять что проблема масштабна и реально описаний как все исправить почти нет
1GB вообще странный хостинг — годится только для сайтов-визиток с посещаемостью стремящейся к нулю.
Там много к чему претензии можно иметь, кодировка БД даже не во главе списка.
До сих пор с ужасом вспоминаю как делал подобное для базы инвиженовского форума… правда мне попался еще более сложный случай потому что в базу латин писался уникод который реально был текстом в koi8-r :) сидел и вручную дамп конвертил :)
раздули проблему, если данные реально представляют ценность то, все эти процедуры можно сделать за очень и очень скромную сумму у профи…
некоторых жаба давит (вспоминая как один тут давно просил помочь переделать ему базу галереи одной), но нахаляву вообще а потом еще и возмущался тут и на форуме галереи что его послали
НаВашем сайте путаница с кодировкой… Вперемешку то нормальные строки русскими буквами, то знаки вопросов сплошь.
1 сайт не мой
2 причины проблемы не знаю — спросите у авторов сайта что они меняли. все было нормально
Интересно, а если дамп занимает 100-200 Мб то задача не решаема? :)
Только что отконвертил базу слитую чарез phpmyadmin. Поля с дефолтной кодировкой — latin1, в которые данные писались в ср1251 и естественно крокозяблы а не дамп. Решилось все очень просто
cat db_duml.sql |iconf -c -f utf-8 -t latin1 > db_dump_iso.sql возвращием дамп в исходное состоянии, т.к. mysql считает что данные хранятся в латин1 а кодировка клиента(ПХП) — utf-8 и естественно не правильно их конвертит
cat db_dump_iso.sql |iconv -c -f latin1 -t cp1251 |replace «latin1» «cp1251» > dump_cp.sql конвертим в cp1251 и заменяем в дампе латин1 на cp1251
после этого в начало файла дампа добавляем запись SET NAMES cp1251;
При необходимости в скриптах после mysql_connect() mysql_select_db() добавляем mysql_query(‘SET NAMES cp1251’)
Наверно все таки не криворукость хостеров ключевой момент