Автор Гілка: MySQL: переконвертувати з одного кодування в інше.  (Прочитано 3189 раз)

Відсутній Sirko

  • Графоман
  • ****
  • дописів: 299
  • Карма: +0/-0
  • Що новенького?
Доброго дня всім!
Підкажіть (якщо хто знає), я переконвертувати базу в кодуванні latin1 в utf8? Стандартними засобами мускуля можна (я в ньому не сильний)? Наперед вдячний за відповідь.
[Kubuntu User]

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Можна звичайним оператором ALTER поміняти кодування бази та кожної таблиці: ALTER ... CHARACTER SET utf-8;

Найпростіший, на мій погляд, варіант - це зробити дамп усієї бази, конвертнути в потрібне кодування (напр. з допомогою iconv), підправити кодування бази і таблиць в дампі й залити його назад.

Не забудьте також виставити кодування для клієнта.
[Fedora Linux]

Praporshic

  • Гість
В MySQL є багато різних параметрів що стосуються кодувань. Наприклад, можна задавати окремо кодування для кожного з'єднання. Можна задати кодування для окремої таблиці та навіть для кожного стовпчика в таблиці. Більш того, одного разу одне "тіло" зробило базу з кодуванням latin1, призначили кодування з'єднання koi8-u, після чого почали вливати інформацію у кодуванні cp1251... "Штірліц" на те, що вийшло образився та перекодувати відмовився.....

Відсутній Sirko

  • Графоман
  • ****
  • дописів: 299
  • Карма: +0/-0
  • Що новенького?
Можна звичайним оператором ALTER поміняти кодування бази та кожної таблиці: ALTER ... CHARACTER SET utf-8;
А можна детальніше? бо я з мускулем знайомий постільки/поскільки...
Найпростіший, на мій погляд, варіант - це зробити дамп усієї бази, конвертнути в потрібне кодування (напр. з допомогою iconv), підправити кодування бази і таблиць в дампі й залити його назад.

Не забудьте також виставити кодування для клієнта.

Пробував. Не вийшло - лишились кракозяблики..... Робив так:
mysqldump бази в latin1, потім  iconv -f iso-8859-1 -t utf-8 database.sql > database_utf8.sql
[Kubuntu User]

Відсутній Sirko

  • Графоман
  • ****
  • дописів: 299
  • Карма: +0/-0
  • Що новенького?
В MySQL є багато різних параметрів що стосуються кодувань. Наприклад, можна задавати окремо кодування для кожного з'єднання. Можна задати кодування для окремої таблиці та навіть для кожного стовпчика в таблиці. Більш того, одного разу одне "тіло" зробило базу з кодуванням latin1, призначили кодування з'єднання koi8-u, після чого почали вливати інформацію у кодуванні cp1251... "Штірліц" на те, що вийшло образився та перекодувати відмовився.....

Мені не треба так складно :) Хочу всього навсього перенести базу з CentOS на Gentoo... Пробував навіть на gentoo default encoding в мускулі ставити в latin1 - не допомогло (хоча show variables; каже що все в latin1).....
[Kubuntu User]

Praporshic

  • Гість
Якщо вірити тому, що каже iconv на моєму ноуті, то треба зробити так:
iconv -f LATIN1 -t UTF-8 database.sql > database_utf8.sql  

Відсутній Sirko

  • Графоман
  • ****
  • дописів: 299
  • Карма: +0/-0
  • Що новенького?
Якщо вірити тому, що каже iconv на моєму ноуті, то треба зробити так:
iconv -f LATIN1 -t UTF-8 database.sql > database_utf8.sql  
Не допомогло..... Кракозябли так і лишились
[Kubuntu User]

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Якщо вірити тому, що каже iconv на моєму ноуті, то треба зробити так:
iconv -f LATIN1 -t UTF-8 database.sql > database_utf8.sql  

Воно просто переведе кракозябрики в UTF-8.

Було б простіше, якби хтось навів приклад крякозабриків (напр. слово "ТЕст" закодувати в CP1251 і записати в базу як latin1), тоді було б простіше розкодовувати. Я підозрюю, що дані мають лежати в CP1251 але трохи покоцані, так як ISO-8859-1 має менше на 32 символи ніж інші кодування. http://en.wikipedia.org/wiki/Latin1#Code_table

На мою думку (ліньки перевіряти), має допогти щось подібне на це:

mysqldump -u root db >db-orig.sql
cat db-orig.sql | iconv -f CP1251 -t UTF-8 | sed 's/Latin1/utf8/g' | mysql -u root db

Якщо ж база даних дійсно покоцана і iconv її не бере, то заливаєм алфавіт в базу а далі робим:
cat db-orig.sql | tr  'алфавіт покоцаний' 'алфавіт нормальний в cp1251' | iconv -f CP1251 -t UTF-8 | sed 's/Latin1/utf8/g' | mysql -u root db
[Fedora Linux]