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

来源:这里教程网 时间:2026-02-28 20:32:20 作者:

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");

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

相关推荐