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


18

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

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

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

更新:理查德·布罗诺斯基向我展示了方式:-)

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

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

谢谢理查德。你是男人!

Answers:


16

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

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;

如果您对结果感到满意,请删除limit子句,然后将输出保存到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

当您开始考虑使用有效的SQL来生成有效的SQL时,它将改变整个游戏过程。您会为它找到多少用途而感到惊讶。


差不多好了!但是无法正确使用语法
Disintegrator

好,我知道了。我在答案中添加了正确的sintax。您的想法规则
瓦解者

4

实际上,您可以在表上使用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';

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

... WHERE TABLE_SCHEMA = 'databasename';

而不是这样:

... WHERE TABLE_SCHEMA != 'information_schema';

但是我想如果您真的想在所有表上都这样做,则可以使用前者。虽然似乎有点沉重。:)


1

更改我使用的所有列的排序规则

SELECT CONCAT(  'ALTER TABLE ',  `TABLE_NAME` ,  ' CHANGE `',  `COLUMN_NAME` ,  '` `',`COLUMN_NAME` ,  '` ',  `DATA_TYPE` ,  '(',  `CHARACTER_MAXIMUM_LENGTH` ,  ') CHARACTER SET utf8 COLLATE utf8_swedish_ci ;' ) FROM  `COLUMNS` WHERE  `TABLE_SCHEMA` =  <schema> AND  `COLLATION_NAME` !=  'utf8_swedish_ci' ORDER BY  `TABLE_NAME` ,  `ORDINAL_POSITION` ;

0

您可以使用information_schema数据库查找必须更改的列和表。您可以通过以下方式找到它们:

SELECT table_name, column_name FROM information_schema.`COLUMNS`
WHERE table_schema='your database' AND collation_name LIKE 'latin%';

然后,您可以使用SQL脚本,存储过程或首选的开发语言来自动执行更改。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.