mysql迁移后字符集不一致怎么办_mysql编码统一方法

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 = utf8mb4
    collation-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");

不依赖驱动自动推断,始终显式声明。