Смена кодировки всех таблиц MySQL

Если изначально к разработке сайта относится не осознано, то рано или поздно можно столкнуться с достаточно большими проблемами. Особенно сложно эти проблемы будет решать если они будут связаны с базой данных, кодировками, большими объемами данных которые естественно нужно будет сохранить. В нашем случае поговорим о кодировках mysql, рассмотрим реальную ситуацию, которую пришлось решать в экстренном порядке…

Есть достаточно крупный форум, около 2 000 000 записей в базе, на всеми любимой булке (vbulletin 3.8.x), и вот в один прекрасный момент понадобилось его переносить на новый хостинг. Сделали бекап базы, перекинули файлы, импортировали базу на новый хостинг, все вроде бы ничего, но всплыла проблема с кодировкой.

База форума была в кодировке utf8, а сам форум работал в cp1251, начались танцы с бубном… Перепробовал все что только можно, но ни к чему положительному это не приводило, в конце концов решил что проще будет базу перевести в cp1251, хотя сам всем нутром за юникод.

Так как таблиц было много, полей еще больше клацать ручками никак не хотелось и тут в голову пришла мысля про такую табличку о значении которой знает не каждый — information_schema. Она присутствует всегда и как вы догадались в ней содержится много полезной информации, именно благодаря этой табличке мы сможем вытянуть названия таблиц и полей нужной базы данных.

Например

 SELECT CONCAT('ALTER TABLE `', t.`TABLE_SCHEMA`, '`.`', t.`TABLE_NAME`, '` CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;') as sqlcode
 FROM `information_schema`.`TABLES` t
 WHERE 1
 AND t.`TABLE_SCHEMA` = 'db_name'

Итак, по сути мы вытягиваем всю информацию о таблице db_name и генерируем запросы типа

ALTER TABLE `db_name`.`db_table` CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;

Исполняем пачку этих запросов, и получаем базу в нужной нам кодировке, как правило без глюков и ошибок конвертирования. Хотя как по мне лучше изначально кодить под юникод

About: admin


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *