Постала задача забезпечити підтримку юнікоду у базі даних. Після модифікації параметрів підключення до БД виявилось, що замість юнікоду зберігається якась абракадабра.
Хоча були додані стандартні параметри:
- useUnicode=true
- characterEncoding=utf8
- characterSetResults=utf8
- connectionCollation=utf8_general_ci
Уважно подивившись у код дампу БД я побачив, що для усіх таблиць використовується кодування latin1 замість utf8. Нижче ви можете побачити фрагмент дампу:
...
DROP TABLE IF EXISTS `autosave`;
SET @saved_cs_client = @@character_set_client;
SET character_set_client = utf8;
CREATE TABLE `autosave` (
`id` int(10) unsigned NOT NULL auto_increment,
`create_time` timestamp NOT NULL default CURRENT_TIMESTAMP
on update CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
SET character_set_client = @saved_cs_client;
...
Традиційний програміст почав би копати документацію MySQL на тему зміни кодування БД та окремих таблиць, але сьогодні я обрав тактику системного адміністратора: я вирішив замінити кодування прямо у дампі БД.
Отже спочатку я створюю дамп БД у файлі dump.sql:
$ mysqldump -u КОРИСТУВАЧ -p БД > dump.sql
Потім використовую команду sed для заміни всіх кодувань таблиць:
$ sed -i 's/DEFAULT CHARSET=latin1;/DEFAULT CHARSET=utf8;/' dump.sql
Якщо лячно одразу використовувати цей запит на реальному дампі, можете переглянути спочатку його результати (що саме він модифікує) такою командою:
$ sed -n 's/DEFAULT CHARSET=latin1;/DEFAULT CHARSET=utf8;/p' dump.sql
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
...
Тепер видаляємо стару БД, створюємо її знову, але вже з кодуванням UTF-8 за умовчанням:
$ mysql -u КОРИСТУВАЧ -p БД
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 36
Server version: 5.0.51a-24+lenny2 (Debian)
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql> DROP DATABASE БД;
Query OK, 64 rows affected (0.20 sec)
mysql> CREATE DATABASE БД DEFAULT CHARSET utf8;
Query OK, 1 row affected (0.01 sec)
mysql> exit
Bye
І нарешті заливаю новий дамп:
$ mysql -u КОРИСТУВАЧ -p БД < dump.sql