MySQL迁移后字符集不一致的核心是客户端、连接层、表结构、存储引擎四层必须统一为UTF8MB4;需逐层检查并修改配置、库表编码及应用连接字符串,确保全链路一致。

MySQL迁移后字符集不一致,核心是确保 客户端、连接层、表结构、存储引擎 四个层面统一使用 UTF8MB4(推荐)或至少 UTF8。只改某一层,问题仍会复现。
检查当前各层字符集设置
登录 MySQL 后逐条执行:
-
查看服务器默认字符集:
SHOW VARIABLES LIKE 'character_set_server'; -
查看数据库字符集:
SHOW CREATE DATABASE db_name; -
查看表字符集:
SHOW CREATE TABLE table_name; -
查看连接时的字符集:
SHOW VARIABLES LIKE 'character_set_client';和SHOW VARIABLES LIKE 'collation_connection';
统一修改数据库和表的字符集
先改库,再改表,避免新旧混用:
-
修改数据库默认字符集:
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; -
批量修改所有表(需逐个执行):
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -
若字段有特殊 COLLATION,可单独指定:
ALTER TABLE table_name MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
配置文件强制统一连接层编码
编辑 MySQL 配置文件(如 /etc/my.cnf 或 /etc/mysql/my.cnf),在 [mysqld] 和 [client] 段落中加入:
-
[mysqld]下添加:character-set-server = utf8mb4collation-server = utf8mb4_unicode_ci -
[client]和[mysql]下添加:default-character-set = utf8mb4
修改后重启 MySQL 服务生效。
应用端连接字符串必须显式指定编码
即使服务端已设好,客户端不声明仍可能走默认编码(如 latin1)。常见写法:
-
JDBC:
?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Shanghai -
Python PyMySQL/MySQLdb: 加参数
charset='utf8mb4' -
PHP mysqli: 连接后立即执行
$mysqli->set_charset("utf8mb4");
不依赖驱动自动推断,始终显式声明。










