在MySQL中的所有表中的所有列中更改字符集和排序规则

Modified on: Thu, 15 Aug 2019 01:00:03 +0800

我需要在所有列的所有列中执行这些语句。

alter table table_name charset=utf8;
alter table table_name alter column column_name charset=utf8;

是否可以在MySQL内以任何方式自动执行此操作?
我宁愿避免使用mysqldump

更新:
Richard Bronosky向我展示了道路: - )

我需要在每个表中执行的查询:

alter table DBname.DBfield CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

疯狂查询以生成所有其他查询:

SELECT distinct CONCAT( 'alter table ', TABLE_SCHEMA, '.', TABLE_NAME, '  CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'DBname';

我只想在一个数据库中执行它。
在一次通过中执行所有操作需要很长时间。事实证明,每个表每个字段生成一个查询。并且每个表只需要一个查询(与救援不同)。获取文件的输出是我意识到的。

如何生成文件输出:

mysql -B -N --user=user --password=secret -e "SELECT distinct CONCAT( 'alter table ', TABLE_SCHEMA, '.', TABLE_NAME, '  CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'DBname';" > alter.sql

最后执行所有查询:

mysql --user=user --password=secret < alter.sql

谢谢理查德。你是男人!

最佳答案

首先,不要只听我的话!用这个来测试我的建议:

select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' charset=utf8;') from information_schema.TABLES WHERE TABLE_SCHEMA != 'information_schema' limit 10; select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' alter column ',COLUMN_NAME,' charset=utf8;') from information_schema.COLUMNS WHERE TABLE_SCHEMA != 'information_schema' limit 10;

如果您对结果感觉良好,请删除限制子句并将输出保存到SQL脚本中,或者直接将输出管道输出到mysql,类似于我演示的here。这看起来像这样:

mysql -B -N --host=prod-db1 --user=admin --password=secret -e "select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' charset=utf8;') from information_schema.TABLES WHERE TABLE_SCHEMA != 'information_schema'; select CONCAT('alter table ',TABLE_SCHEMA,'.',TABLE_NAME,' alter column ',COLUMN_NAME,' charset=utf8;') from information_schema.COLUMNS WHERE TABLE_SCHEMA != 'information_schema';" | mysql --host=prod-db1 --user=admin --password=secret

当您开始考虑使用有效的SQL生成有效的SQL时,它会改变整个游戏。您会惊讶于您找到了多少用途。


相关问答

添加新评论