Mysql 如何仅更改现有表的排序规则而不是字符集?

Mysql 如何仅更改现有表的排序规则而不是字符集?,mysql,Mysql,这个问题是关于现有表的。更改数据库的默认值是一个很好的话题 这里关于堆栈溢出的大多数问题似乎都假设您希望同时更改字符集和排序规则,例如从latin1_general_ci更改为utf8_spanish_ci。答案通常建议: ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_spanish_ci; ALTER TABLE转换为字符集utf8 COLLATE utf8\u西班牙语\u ci; 当字符

这个问题是关于现有表的。更改数据库的默认值是一个很好的话题

这里关于堆栈溢出的大多数问题似乎都假设您希望同时更改字符集和排序规则,例如从latin1_general_ci更改为utf8_spanish_ci。答案通常建议:

ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_spanish_ci;
ALTER TABLE转换为字符集utf8 COLLATE utf8\u西班牙语\u ci;
当字符集保持不变时,这似乎是一种浪费——只有排序规则应该更新——但也许MySQL足够聪明,因此它发现字符集是相同的,并且没有浪费任何资源

问题变成了:如果只有排序规则在更改,那么为现有表(及其列)更新排序规则的建议步骤是什么?

我认为答案是:

对于每一张桌子,请

ALTER TABLE <table_name> COLLATE utf8_spanish_ci;
和列

SELECT concat('ALTER TABLE `', TABLE_SCHEMA, '`.`', table_name, '` MODIFY `', column_name, '` ', COLUMN_TYPE, ' COLLATE utf8_spanish_ci;') 
from information_schema.columns 
where TABLE_SCHEMA like 'database_name' and COLLATION_NAME = 'utf8_general_ci';

如果上面的
ALTER TABLE
有效,那么问题是什么?你真的认为性能是一个问题吗?是的,如果不是的话,我不会问这个问题。将大量数据从一个字符集转换为另一个字符集是一项艰巨的工作。如果您只能更改表和列的元数据,那就更好了。相关:查看推荐答案时使用“ALTER TABLE CONVERT TO CHARACTER SET…”然后使用“ALTER TABLE MODIFY…”这应该是不必要的,因为我想我只是在寻找一些明确的答案。接下来我自己:我只是用一个数据库做了一个小测试。制作两份副本,并在一个数据库的所有表上运行“ALTER TABLE CONVERT TO CHARACTER SET…”,在另一个数据库的所有表上运行“ALTER TABLE COLLATE…”。第一次耗时22秒,第二次耗时21秒。我的担心似乎白费了。如果有人能证实这一点,那就太好了。
SELECT concat('ALTER TABLE `', TABLE_SCHEMA, '`.`', table_name, '` COLLATE utf8_spanish_ci;') 
from information_schema.tables 
where TABLE_SCHEMA like 'database_name' and TABLE_COLLATION = 'utf8_general_ci';
SELECT concat('ALTER TABLE `', TABLE_SCHEMA, '`.`', table_name, '` MODIFY `', column_name, '` ', COLUMN_TYPE, ' COLLATE utf8_spanish_ci;') 
from information_schema.columns 
where TABLE_SCHEMA like 'database_name' and COLLATION_NAME = 'utf8_general_ci';