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)
但我想如果你真的想在所有表上都这样做,你可以使用前者。不过对我来说似乎有点沉重。:)
| 归档时间: |
|
| 查看次数: |
35065 次 |
| 最近记录: |