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

The*_*tor 21 mysql automation sql

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

alter table table_name charset=utf8;
alter table table_name alter column column_name charset=utf8;
Run Code Online (Sandbox Code Playgroud)

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

更新:Richard Bronosky 向我展示了方式:-)

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

alter table DBname.DBfield CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)

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

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';
Run Code Online (Sandbox Code Playgroud)

我只想在一个数据库中执行它。一口气执行所有操作花费的时间太长。事实证明,它为每个表的每个字段生成一个查询。每个表只需要一个查询(与救援不同)。在文件上获取输出是我实现它的方式。

如何生成输出到文件:

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
Run Code Online (Sandbox Code Playgroud)

最后执行所有查询:

mysql --user=user --password=secret < alter.sql
Run Code Online (Sandbox Code Playgroud)

谢谢理查德。你就是那个人!

Bru*_*sky 19

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

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;
Run Code Online (Sandbox Code Playgroud)

如果您对结果感到满意,请删除限制子句并将输出保存到 SQL 脚本,或者像我在此处演示的那样将输出直接通过管道传输到 mysql 。那看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

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


小智 8

实际上,您可以在表上使用 CONVERT TO 让它将该表中的所有列转换为字符集和排序规则。

SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'databasename';
Run Code Online (Sandbox Code Playgroud)

此外,对我来说,选择要在其上执行此操作的实际数据库更有意义。所以这:

... WHERE TABLE_SCHEMA = 'databasename';
Run Code Online (Sandbox Code Playgroud)

而不是这个:

... WHERE TABLE_SCHEMA != 'information_schema';
Run Code Online (Sandbox Code Playgroud)

但我想如果你真的想在所有表上都这样做,你可以使用前者。不过对我来说似乎有点沉重。:)