Конвертація бази mysql cp1251–>utf8: Неправильне відображення літер ш та І

9 Лютого, 2012 | Теґи: , , , ,

Думаю, не один я стикався з проблемою переносу бази з сервера з серверним кодуванням cp1251 на сервер з utf8. Після роздампу можна побачити неприємність у відображенні літер ш та І.
Це можна поправити двома способами:



Спосіб 1.
Використати можна, якщо є доступ на старий сервер.
— дампимо базу

mysqldump --create-options --compatible=mysql40 DB > DB.sql

УВАГА!!! Якщо в конфігурації [mysqldump] вказане кодування в default-character-set, і немає root-доступу, то спосіб автоматично відпадає, тому що опції серверного рівня мають вищий пріоритет за ті, що вказані в консолі.
— копіюємо на новий сервер
— роздамплюємо примусово в потрібному кодуванні

mysql --default-character-set=utf8 DB < DB.sql



Спосіб 2. © Каратель
Маємо вже зроблений дамп в cp1251. Так як шістнадцяткові коди проблемних літер відрізняються від потрібних

cp1251 :  ш — 0xD13F  І — 0xD03F
utf8 :    ш — 0xD188  І — 0xD098

замінимо їх потрібними з таблиці кодування utf8.

LC_ALL=C perl -pi -e "s|\xD1\x3F|\xD1\x88|g" DB.sql
LC_ALL=C perl -pi -e "s|\xD0\x3F|\xD0\x98|g" DB.sql

Все. Тепер можна заливати дамп в базу.



Спосіб 3.
Коли БД все працює. Запитами до БД:

UPDATE `table` SET `field` = REPLACE(
`field`,
CONCAT( CHAR(209), CHAR(63) ),
CONCAT( CHAR(209), CHAR(136) )
); 

UPDATE `table` SET `field` = REPLACE(
`field`,
CONCAT( CHAR(208), CHAR(63) ),
CONCAT( CHAR(208), CHAR(152) )
); 

Проте це треба робити з кожним полем кожної таблиці, де зустрічаються ці букви.



ОФТОП. Поки відбирав матеріал, знайшов цікавинку: повна таблиця символів Юнікоду 🙂
Юнікод

Ще немає коментарів.