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

时间:2017-02-06 01:03:09

标签: mysql

这个问题是关于现有表格。更改了数据库的默认值。

Stack Overflow上的大多数问题似乎都假设您要更改字符集和排序规则 - 例如从latin1_general_ci到utf8_spanish_ci。答案通常建议:

ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_spanish_ci;

当字符集不变时,这似乎是一种浪费 - 只需要更新排序规则 - 但是MySQL可能足够聪明,因此它发现字符集是相同的,没有浪费资源?

问题变成:如果只有整理正在改变,那么为现有表(及其列)更新它的建议程序是什么?

1 个答案:

答案 0 :(得分:1)

我认为答案是:

对于每个表,请执行

ALTER TABLE <table_name> COLLATE utf8_spanish_ci;

对于每列,请执行

ALTER TABLE <table_name> MODIFY <column_name> <column_type> COLLATE utf8_spanish_ci;

您可以使用information_schema数据库生成要运行的SQL - 仅用于所需的表

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';