Архив
Решение проблем с нарушением отображения букв «ш» и «И» в резултате неудачной перекодировки 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
GRANT ALL PRIVILEGES ON БД.* TO пользователь@localhost IDENTIFIED BY 'пароль';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP PRIVILEGES ON БД.таблица TO
пользователь@'%.domain.ru' IDENTIFIED BY 'пароль';
или
insert into user (host,user,password)
values ('localhost','пользователь',password('pas'));
insert into db
(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,
Drop_priv,Grant_priv,References_priv,Index_priv,Alter_priv)
values ('localhost','БД','пользователь','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
flush privileges;
или воспользоваться скриптом mysql_setpermission