конвертация Mysql из latin1 в utf8

Dave

Новичок
конвертация Mysql из latin1 в utf8

Приветствую!
имеется древний мультиязычный сайт, charset у БД и таблиц стоит latin1
и есть таблица где указано какой charset нужно указывать на самом вебсайте, т.е. для русского там стоит windows-1251, для германии iso-88591 и так далее т.е. когда переключаешься между странами на страницке в charset пишется соответствующая кодировка
в главном индексном файле где происходит коннект к бд никаих set names не делается , то есть используется latin1 который стоит по умолчанию.


как правильно все это перевести в utf8 ?

использую способ описаный тут :http://blog.sjinks.pro/mysql/3-convert-mysql-database-from-one-charset-to-another/
mysqldump -uuser -ppassword --default-character-set=latin1 -n -K --skip-set-charset --skip-create-options --skip-extended-insert --compatible=mysql40 --max_allowed_packet=64K dbname > latin_dump.sql iconv -f ISO-8859-1 -t UTF-8 latin_dump.sql > utf8_dump.sql mysql --max_allowed_packet=1M -uuser -ppassword --default-character-set=utf8 database_utf8 < utf8_dump.sql
после данных действий в index.php я прописал set names 'utf-8' и на самой веб-странице ставлю кодировку utf-8 и все отображается ок кроме русских символов, вместо них кракозябры вида
&#193;&#238;&#235;&#252;&#248;&#229; &#232;&#237;&#244;&#238;&#240;&#236;&#224;&#246;&#232;&#232;
как можно решить проблему ?

пока имеется в глове как вариант написать скрипт который будет вытягивать из бд записи с этими кракозябрами, перекодировать их с помощью iconv в нужные символы и обновлять запись вставляя правильные символы... что то вроде этого...буду пробовать.
 

dimagolov

Новичок
использую способ описаный тут
вот возьми, сделай эту конвертацию пошагово и посмотри что получается на каждом шаге и где ошибка.

вместо них кракозябры вида
ну а реально данные в какой кодировке и какие на страницу попадают? если в uft-8, то ошибка перекодировки.

-~{}~ 18.02.10 11:34:

http://phpfaq.ru/charset
твоя перекодировка принципиально не может русский текст правильно перекодировать из за вот этого:
iconv -f ISO-8859-1 -t UTF-8
если iconv делать придется, то его нужно делать из РЕАЛЬНОЙ кодировки русских символов в UTF-8.

-~{}~ 18.02.10 11:37:

да, вот еще. перед тем, как заливать дамп в нем нужно еще sed-ом поменять кодировку таблиц-полей и collation на UTF-8 вместо того, что там было левого, одного default-а не хватит.
 

Dave

Новичок
после конвертации открываю файл в кодировке utf-8 и там вместо русских символов кракозабры уже.
твоя перекодировка принципиально не может русский текст правильно перекодировать из за вот этого:

если iconv делать придется, то его нужно делать из РЕАЛЬНОЙ кодировки русских символов в UTF-8.
тогда получается бэкап целиком я не конвертну никак, раз там есть и latin1 и windows-1251 символы,
тогда что остается, ручками скрипт писать ? больше нет вариантов ?
 

dimagolov

Новичок
раз там есть и latin1 и windows-1251 символы,
ну это в общем-то очевидно. его же и просмотреть нормально не получится ни в какой кодировке.

если там одни таблицы в 1251, а другие в latin1, то можно файл порезать потаблично и конвертнуть, а потом склеить.

если же в одной таблице винегрет, то я не понимаю как это вообще могло работать.
 

Dave

Новичок
да, винигрет

у всех таблиц и у БД кодировка latin1
единственная разница между странами это на фронтенде указывал разный charset в тэге Meta и это работает,
а сейчас нужно привести это все в порядок, т.е. в utf8
...
 

dimagolov

Новичок
Dave, а как данные из таблицы выбираются для разных стран? может построить временные таблицы по каждой стране?

но все будет руками медленно и печально теперь.
 

Dave

Новичок
Автор оригинала: dimagolov
Dave, а как данные из таблицы выбираются для разных стран? может построить временные таблицы по каждой стране?

но все будет руками медленно и печально теперь.
select * from tablename where country_id = "id страны"

вот так и выбирается.

та не, временные таблицы... надо решить эту проблему раз и навсегда.
 

dimagolov

Новичок
Dave, я имел в виду, что поделить данные во временные таблицы по странам, сделать дамп, порезать его потаблично, конвертнуть/подправить оптом дампы таблиц по каждой стране, залить обратно и потом слить из временных таблиц в основные.

все же веселей, чем каждую запись конвертить руками.
 

dimagolov

Новичок
даже немного проще. после перекодировки insert-фрагменты каждой таблицы для разных стран можно будет слить прямо в дампе в одну таблицу, кодировка ведь уже одна будет. правда руками. но с другой стороны сливать из временных таблиц тоже нужно будет руками, так что так на так.
 

Mols

Новичок
[telepat mode]
Очень даже похоже, что у него всё нормально конвертнулось.
А раньше работало всё без учета мета тегов.
И сейчас все работает, просто скорее всего хидер отдаёт (как видимо и раньше) ISO-8859-1
Поэтому русские символы он и не видит.
[/telepat mode]

Как в ХТМЛ выглядят русские символы?
Что нить навроде "&1256;" ? (я имею в виду в старой версии до перекодировки)
 

Фанат

oncle terrible
Команда форума
я тоже так подумал. но потом дальше почитал
ну с какой стати у него иконв сделает при перекодировке из ISO-8859-1 в UTF-8 русские буквы?
 

Dave

Новичок
Автор оригинала: Mols
[telepat mode]
Очень даже похоже, что у него всё нормально конвертнулось.
А раньше работало всё без учета мета тегов.
И сейчас все работает, просто скорее всего хидер отдаёт (как видимо и раньше) ISO-8859-1
Поэтому русские символы он и не видит.
[/telepat mode]

хидеры я везде utf-8 отдаю,
в фаерфоске кода захожу в свойства страницы то вижу :
Encoding: utf-8
Charset : utf-8
но кракозябры вместо кириллицы.
 

Mols

Новичок
Ф анат
А хз. Браузер же понимает, что они русские. Почему эта утилита не должна понять?
Хотя похоже критика таки обоснованная))) Нигде не нашел, что русский входит в ISO-8859-1
 

Фанат

oncle terrible
Команда форума
Это в латин1 они были русские. потому что один код символа на всех
а у утф они уже ТОЛЬКО латинские.
 

kotpl_

Новичок
Посмотрите сначала в какой кодировке хранятся данные в таблицах MySQL. Например это можно сделать так, скопируйте БД на рабочую станцию и откройте в фаре по ф3 и определите в какой кодировке данные хранятся. Я думаю, исходя из ваших слов, там данные хранятся не в cp1251 а в виде &код символа. После этого уже можно решать куда двигаться дальше...
 

Dave

Новичок
Автор оригинала: kotpl_
Посмотрите сначала в какой кодировке хранятся данные в таблицах MySQL. Например это можно сделать так, скопируйте БД на рабочую станцию и откройте в фаре по ф3 и определите в какой кодировке данные хранятся. Я думаю, исходя из ваших слов, там данные хранятся не в cp1251 а в виде &код символа. После этого уже можно решать куда двигаться дальше...
вот в таком виде хранятся: &#193;&#238;&#235;&#252;&#248;&#229; &#232;&#237;&#244;&#238;&#240;&#236;&#224;&#246;&#232;&#232;

решаю проблему сейчас таким способом:

1.записи с которые принадлежат россии конвертирую отдельно , т.е. делаю бэкап таблицы который содержит в себе только русскоязычные записи.

mysqldump -uuser -ppass --skip-set-charset --default-character-set=latin1 -w"language='ru'" -t dbname tablename>tablename_latin.sql


2.потом преобразую из windows-1251 в utf8

iconv -f cp1251 -t UTF-8 tablename_latin.sql >tablename_utf8.sql

3. в самой таблице в БД удаляю все записи принадлежащие России,
delete from tablename where language="ru";

4. вставляю готовый дамп:
mysql -uuser -ppass --default-character-set=utf8 -Ddbname<ic_var_utf8.sql

и все работает.

Гемор только в том что таблиц много и приходится с каждой такие операции производить.
если кто то знает более удобный способ , сообщите плз.

И спасибо всем за ответы !
 

Фанат

oncle terrible
Команда форума
а зачем iconv - то делать?
почему не просто два дампа - выгрузил-загрузил?

-~{}~ 22.02.10 16:15:

тем более, что при создании дампа можно задать имена таблиц
задал один раз все русские, потом - остальные.
и все, два действия.
 

Dave

Новичок
Автор оригинала: *****
а зачем iconv - то делать?
почему не просто два дампа - выгрузил-загрузил?

-~{}~ 22.02.10 16:15:
а как кракозябры русскими символами станут нормально ?

хотя, не понимаю как iconv их переводит в нормальный нужный вид, но он это делает. И имея нормальный бэкап я уже вливаю его в БД.

тем более, что при создании дампа можно задать имена таблиц
задал один раз все русские, потом - остальные.
и все, два действия.
если честно, то не понял. может туплю.
Можно поподробнее ?
 
Сверху