Главная | Контакты



Главная > Программы > MySQL

Решение проблем с нарушением отображения букв "ш" и "И" в резултате неудачной перекодировки mysql

Если в mysql принудительно указать кодировку cp1251, а потом выполнить смену кодировки базы на UTF-8, то вместо букв «ш» и «И» будут стоять вопросики.
Типичное проявление – бекап баз в кодировке UTF-8 с последующим их восстановлением или просто апдейт CMS, для которых родная кодировка – юникод. Например – Wordpress, Drupal

Изучив Google, было найдено масса подобных проблем но все решение сводилось к удалению базы и заливки их резервной копии, что конечно не может быть решением.

Изучав особенности кодировки, я обратил внимание на то, что в mysql дампе буквы ш и И имели неверный код:
ш – 0xD13F
И – 0xD03F

В то время как верные коды для этих букв:
ш – 0xD188
И – 0xD098

Для интереса я проверил как отрабатывает на коды символов Perl в юникодной консоле:

perl -e ‘printf «%#x\n», ord(«И»);’
0xd0
perl -e ‘printf «%#x\n», ord(«ш»);’
0xd1

Таким образом данный сбой происходит из-за каких то нарушений в таблицах кодировок.

Исправить проблему очень просто, достаточно сделать дамп и выполнить две замены через Perl:

LC_ALL=C perl -pi -e «s|\xD1\x3F|\xD1\x88|g» dump.sql
LC_ALL=C perl -pi -e «s|\xD0\x3F|\xD0\x98|g» dump.sql

После чего залить исправленный дамп обратно в базу

Надеюсь, это сбережет многим массу времени и нервов.


Главная > Программы > MySQL