2023.03.13 Mysql 修改表和字段的字符集

如果你想将 mysql 的所有表,以及表的所有字段,都统一改为 utf8mb4_general_ci,你可以参考以下步骤:

一、单表操作

  • 首先,修改数据库的默认字符集为 utf8mb4,并指定排序规则为 utf8mb4_general_ci。你可以使用以下语句:
ALTER DATABASE db_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  • 然后,修改每个表的默认字符集为 utf8mb4,并指定排序规则为 utf8mb4_general_ci。你可以使用以下语句:
ALTER TABLE tbl_name DEFAULT CHARACTER SET utf8mb4COLLATEutf8mb4_general_ci;
  • 最后,修改每个表中的每个字段的字符集为 utf8mb4,并指定排序规则为 utf8mb4_general_ci。你可以使用以下语句:
ALTER TABLE tbl_name CHANGE c_name c_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

注意,这些操作会在字符集中转换列值,如果原来的列值使用的是不兼容的字符集,那么可能会导致数据损坏或乱码。所以,在执行这些操作之前,请务必备份好数据库。

二、批量操作

如果你想批量修改多个表和字段的字符集,你可以利用 information_schema 库中的元数据信息来生成相应的 SQL 语句。例如,如果你想批量修改数据库 db_name 中所有表和字段的字符集为 utf8mb4,并指定排序规则为 utf8mb4_general_ci,你可以使用以下语句:

-- 批量修改所有表的默认字符集
SELECT CONCAT('ALTER TABLE ', table_name, ' DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;') AS _sql FROM information_schema.`TABLES` WHERE TABLE_SCHEMA = 'db_name';

-- 批量修改所有字段的字符集
SELECT CONCAT('ALTER TABLE ', table_name, ' MODIFY ', column_name, ' ', data_type, '(', character_maximum_length, ') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci', (CASE WHEN is_nullable = 'NO' THEN ' NOT NULL' ELSE '' END), ';') AS _sql FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = 'db_name';

需要注意,批量修改所有字段的字符集,有些结果是空,原因有以下几种:

  • 有些字段的数据类型不是字符型,而是数值型、日期型或其他类型,这些字段没有字符集和排序规则的属性,所以修改字符集的语句会为空。你可以在查询语句中加上一个条件,只选择 character_maximum_length 不为空的字段。

  • 有些字段的字符集和排序规则已经是 utf8mb4 和 utf8mb4_general_ci,所以修改字符集的语句会为空。你可以在查询语句中加上一个条件,只选择 character_set_name 和 collation_name 不等于 utf8mb4 和 utf8mb4_general_ci 的字段。

  • 有些字段的数据类型不支持指定长度,例如 text、blob 等,所以修改字符集的语句会出错。你可以在查询语句中去掉 character_maximum_length 的括号,或者根据不同的数据类型进行判断。

如果上述三种情况的条件和判断都加入到一个语句中,如下:

SELECT CONCAT('ALTER TABLE ', table_name, ' MODIFY ', column_name, ' ', data_type, CASE WHEN data_type IN ('text','blob') THEN '' ELSE CONCAT('(', character_maximum_length ,')') END ,  'CHARACTER SET utf8mb4COLLATE utf8mb4_general_ci ', (CASE WHEN is_nullable = 'NO' THEN ' NOT NULL' ELSE '' END), ';') AS _sql FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = 'db_name' AND character_maximum_length IS NOT NULL AND character_set_name <> 'utf8mb4' AND collation_name <> 'utf8mb4_general_ci';

执行后得到的就是修改数据库中所有表和字段字符集的语句,然后复制这些语句执行就可以了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容