技术饭
MySQL 批量修改数据表编码及字符集
经常使用SQLyog导出导入数据库时,不懂为什么经常性出现编码错误字符集被设置成了默认,奇怪的很,可能是软件版本问题,当需要修改数据库编码和字符集时,通常需要对其下属的所有表及表中所有字段进行修改。以下备注批量修改方案( 以修改为 utf8mb4_general_ci为例,注意将 db_name 换为真实的数据库名 )。
1. 修改数据库编码及字符集
这一步比较简单,直接执行即可:
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
2. 修改数据表与表中字段的编码及字符集
这里需要两步。
首先,需要利用语句,生成所有实际执行的语句:
SELECT
CONCAT(
"ALTER TABLE `",
TABLE_NAME,
"` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
) AS target_tables
FROM
INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = "pddadmin"
AND TABLE_TYPE = "BASE TABLE";
此语句会基于 MySQL 的元数据表,得到一组可直接执行的 SQL 列表,如下:
ALTER TABLE `aikehou_activity` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `aikehou_activity_address_group` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `aikehou_activity_address_user` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `aikehou_activity_browse_log` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `aikehou_activity_discount` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `aikehou_activity_form` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE `aikehou_activity_form_field` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
然后,直接将语句粘贴并执行即可。
注意,这里使用 CONVERT TO 而非 DEFAULT,是因为后者不会修改表中字段的编码和字符集。
此外,对于数据表比较多的数据库,可以先将第一步的执行结果导出到 .sql 文件,再通过该 SQL 文件执行即可。
文明上网理性发言!