петък, 25 октомври 2013 г.

Оправяне на счупен енкодинг в MySQL

Опитна постановка:
Инсталация на форум / електронен магазин / попълни необходимото, на MySQL с колация на таблиците latin1 и текст на кирилица, който реално е в cp-1251. Налага ни се да мигрираме, копираме, ъпгрейдваме, (попълни каквото ти скимне тук).

Класиката на омазването - mysqldump конвертира файла в unicode (utf8), но решава че изходните данни са в latin1 (ISO 8859-1) character set.

Решението:
  • Прави се дъмп с изрично зададен latin1 encoding (не винаги възможно)
  • Конвертираме файла по дългият начин.
Дългият начин представлява следното:
  • бекъп на файла
  • recode utf8..latin1 dump.sql 
  • unix2dos dump.sql
  • recode cp1251..utf8 dump.sql
  • замяна на всички CHARSET=latin1 COLLATE=latin1_bin с CHARSET=utf8 COLLATE=utf8_bin
  • най вече на /*!40101 SET NAMES latin1 */ с  /*!40101 SET NAMES utf8 */
  • импорт на така конвертираният дъмп
Подводни камъни:

  • Ако някъде в текста се срещат апострофи, на финала те няма да бъдат ескейпнати. Т.е. се налага редакция на ръка.
  • Новата версия на MySQL (MariaDB) не винаги се съобразява с default-character-set подаден на команден ред и съответно може да се наложи да се сменят стойностите в my.cnf

Няма коментари:

Публикуване на коментар