Перекодировка баз данных MySQL
Если вы храните в БД данные в кодировке UTF-8, то наверняка сталкивались с ситуацией, когда по ошибке эти данные записывались в таблицу с кодировкой latin1 по умолчанию. Несмотря на то, что данные выглядят совершенно нечитабельно, это можно легко исправить.
Для извлечения данных из БД используется утилита mysqldump
. С параметрами по умолчанию она извлечет данные из БД и сохранит их в текущей кодировке нашей локали. Если в локали кодировка UTF-8, тогда данные испортятся ещё сильнее: они станут закодированными в UTF-8 дважды. Поэтому, при выгрузке дампа необходимо задать некоторые параметры:
mysqldump --default-character-set=latin1 --skip-set-charset mydatabase mytable > mydump.sql
В текущем каталоге будет создан файл mydump.sql с дампом указанной таблицы. Откройте его в текстовом редакторе и найдите код, который создает таблицу:
CREATE TABLE `mytable` ( `id` int(10) unsigned NOT NULL, `name` char(255) NOT NULL default '', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Замените значение CHARSET (кодировка) с latin1 на utf8. Если вы экспортировали несколько таблиц, произведите эту операцию соответствующее число раз. Можно воспользоваться функцией автозамены текстового редактора.
Теперь данные нужно загрузить обратно в БД:
mysql --user=username -p --database=mydatabase < mydump.sql
Этот метод прост, но мало пригоден для работы с большим числом таблиц, а также в том случае, если таблицы имеют много записей. (Проблематично будет загрузить дамп в текстовый редактор.)
CC-BY-CA Анатольев А.Г., 26.11.2012