如果你想将 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';
执行后得到的就是修改数据库中所有表和字段字符集的语句,然后复制这些语句执行就可以了。
网友评论