我需要在所有表的所有列中执行这些语句。
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
谢谢理查德。你就是那个男人!
首先,不要只相信我的话!用这个测试我的建议:
如果您对此结果感到满意,请删除限制子句并将输出保存到 SQL 脚本,或者,像我在此处演示的那样,将输出直接通过管道传输到 mysql 。看起来像这样:
当您开始考虑使用有效 SQL 来生成有效 SQL 时,它会改变整个游戏。你会惊讶于你发现它有多少用途。
实际上,您可以在表上使用 CONVERT TO 来让它将该表中的所有列转换为字符集和排序规则。
此外,对我来说,选择您要在其上执行此操作的实际数据库更有意义。所以这:
而不是这个:
但我想如果你真的想在所有桌子上都这样做,你可以使用前者。不过对我来说似乎有点沉重。:)
要更改我使用的所有列的排序规则
您可以使用
information_schema
数据库来查找您必须更改的列和表。您可以通过以下方式找到它们:然后,您可以使用 SQL 脚本、存储过程或您喜欢的开发语言自动执行更改。
我最终做了以下事情:
mysqldump db_name > db_name.sql
sed -i -e 's/old_charset/new_charset/g' db_name.sql
mysql < db_name
我不会在生产中使用它,但我需要在本地开发环境中使用它。
或者,我可以分别转储 SQL 结构和数据,然后进入 SQL 文件以更改那里的字符集。
请记住,如果您在不兼容的字符集之间进行转换,这可能会弄乱您的数据。
更改字符集 = utf8mb3 的所有表中的所有列
从 information_schema.COLUMNS WHERE TABLE_SCHEMA = 'DB NAME HERE' 和 CHARACTER_SET_NAME = 'utf8mb3'中选择 concat('ALTER TABLE ',TABLE_Name, 'MODIFY
',COLUMN_NAME, '
' , COLUMN_TYPE, 'CHARACTER SET utf8mb4;') 命令;然后运行结果。