MySQL 中文乱码问题需从客户端、服务端、数据库、表、字段五层统一使用 UTF8MB4 编码,修改配置文件设默认字符集,建库建表显式声明,连接时指定 charset=utf8mb4,并谨慎修复存量乱码数据。

MySQL 默认编码不统一,容易导致中文乱码、应用报错或数据存储异常。核心在于从客户端、服务端、数据库、表、字段五个层级统一使用 UTF8MB4 编码(不是旧版 UTF8),并确保连接时明确指定字符集。
一、修改 MySQL 服务端默认编码(全局生效)
编辑 MySQL 配置文件(Linux 通常为 /etc/my.cnf 或 /etc/mysql/my.cnf;Windows 为 my.ini),在 [mysqld] 段下添加:
- character-set-server = utf8mb4
- collation-server = utf8mb4_unicode_ci
- (可选)skip-character-set-client-handshake:强制忽略客户端声明的字符集,以服务端为准(慎用,需确认所有客户端兼容)
⚠️ 注意:重启 MySQL 服务后才生效(systemctl restart mysqld 或 service mysql restart)。
二、创建数据库和表时显式指定编码
即使服务端已设默认值,建库建表仍建议显式声明,避免依赖配置或迁移时出错:
- 创建数据库:
CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 创建数据表:
CREATE TABLE t1 (id INT, name VARCHAR(100)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - 修改已有表编码:
ALTER TABLE t1 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
✅ 关键点:utf8mb4 支持完整 Unicode(含 emoji、生僻汉字),而 MySQL 的 utf8 实际是 utf8mb3,最多只支持 3 字节字符,已不推荐使用。
三、确保客户端连接使用 utf8mb4
仅服务端设置不够——连接时若未声明字符集,MySQL 可能按旧协议协商成 latin1 或其他编码:
- 命令行连接加参数:
mysql -u user -p --default-character-set=utf8mb4 - 应用程序连接字符串中必须包含:
?charset=utf8mb4(如 JDBC:jdbc:mysql://localhost:3306/db?charset=utf8mb4&serverTimezone=UTC) - PHP mysqli 连接后执行:
$mysqli->set_charset("utf8mb4"); - Python PyMySQL 或 mysql-connector-python 初始化时传参:
charset='utf8mb4'
? 验证当前连接编码:SELECT @@character_set_client, @@character_set_connection, @@character_set_results; 三者应均为 utf8mb4。
四、检查与修复存量乱码数据(谨慎操作)
若已有表出现乱码(如中文显示为问号或 Mojibake),说明历史数据是以错误编码写入的。不能直接改表编码,需按“双解码”逻辑修复:
- 先确认原始写入时的错误编码(常见为 latin1 写入 utf8 显示)
- 将字段类型临时改为
BLOB(绕过字符集转换) - 再以正确编码转回
TEXT/VARCHAR并指定 utf8mb4 - 示例(针对 latin1 存、utf8 显示乱码的情况):
ALTER TABLE t1 MODIFY COLUMN name BLOB;ALTER TABLE t1 MODIFY COLUMN name VARCHAR(100) CHARACTER SET utf8mb4;
⚠️ 强烈建议:操作前备份全库,并在测试环境验证修复逻辑。


















