2 августа 2009, 15:42

MySQL convert All tables (encoding, alter)

Иногда нужно поменять кодировку БД (появился новый язык, и нужен утф8 срочно, или поменялась ЦМС, или власть сменилась).
Хм, у нас для этого есть стандартные команды:
ALTER TABLE sometable CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;
ALTER TABLE sometable DEFAULT CHARACTER SET cp1251;
# another way
ALTER TABLE articles CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci
ALTER TABLE articles DEFAULT CHARACTER SET utf8
Казалось бы, всё просто ;) Но а если таблиц 100, 200, 300 о_О это что по одной колбасить? :D
Не смешно :( но выход есть, всё теми же стандартными фишками ;)
# мы возьмём и используем ИнфоСхему ;)
use information_schema;
# Запихаем все таблички базы someDB в МЕМ
select TABLE_SCHEMA, TABLE_NAME from TABLES where TABLE_SCHEMA = "someDB";
# Нарисуем команды
select 
	CONCAT("Alter Table `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` 
		CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;
		Alter Table `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` 
		DEFAULT CHARACTER SET cp1251;") 
	as MySQLCMD from TABLES where TABLE_SCHEMA = "someDB";
# Думаете всё? Магия произошла? нееет!
# Теперь смотрим в аутпут, копируем все команды, 
# и выполняем огромный запрос.
# Для удобства советую phpMyAdmin

ЗЫ: все таблички то в нужной кодировочке, а база то нет ;) не забываем
ALTER DATABASE `someDB` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;
      Ctrl       Javascript insert in html body some tag

3 комментария РСС

DeerUA
Тоже самое для InnoDB в MyISAM:

select concat(’alter table ’,table_schema,’.’,table_name,’ engine=MyISAM;’)
from information_schema.tables
where engine = ’InnoDB’
Vitaliy Bogdanets
Чаще идёт этот вариант:
use information_schema;
# Запихаем все таблички базы someDB в МЕМ
select TABLE_SCHEMA, TABLE_NAME from TABLES where TABLE_SCHEMA = "someDB";
# Нарисуем команды
select 
	CONCAT("Alter Table `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` 
		CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
		Alter Table `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` 
		DEFAULT CHARACTER SET utf8;") 
	as MySQLCMD from TABLES where TABLE_SCHEMA = "someDB";

Deerua
Так же можно переименовать все таблицы
Vitaliy Bogdanets
use information_schema;
# Запихаем все таблички базы someDB в МЕМ
select TABLE_SCHEMA, TABLE_NAME from TABLES where TABLE_SCHEMA = "somedb";
# Нарисуем команды
select 
	CONCAT("RENAME TABLE ", TABLE_NAME, " TO odl_", TABLE_NAME, ";") 
	as MySQLCMD from TABLES where TABLE_SCHEMA = "somedb";
Vitaliy S. Orlov
Так же, если в базе не много данных, например, это какая-нибудь база во время разработки. Можно экспортировать данные в файл, и потом заменить ’utf8’ на ’cp1251’, например в блокноте «Правка»->«Замена». После этого, удалить все таблицы и импортировать новый дамп.
Разумеется, так стоит поступать, только в том случае, если понимаете, последствия :)

Ваш комментарий

адрес не будет опубликован

ХТМЛ не работает


Ctrl + Enter