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

Думаю, не один я стикався з проблемою переносу бази з сервера з серверним кодуванням 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.
Коли БД все працює. Запитами до БД:

View Code SQLUPDATE `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) )
);

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

Опубликовано в MySQL

Рубрики