MySQL中文乱码本质是字符集不一致,需统一客户端、服务器、数据库、表、连接五环节为utf8mb4;通过SHOW VARIABLES确认配置,修改my.cnf永久设置,ALTER DATABASE/TABLE升级旧对象,并在应用连接字符串中指定charset=utf8mb4。

MySQL 中文乱码本质是字符集不一致导致的,核心在于客户端、服务器、数据库、表、连接这五个环节的字符集要统一为 utf8mb4(不是旧版 utf8),否则任意一环掉链子,就可能显示问号、黑方块或 Mojibake(如“æç±ä½ ”)。
一、确认当前字符集配置
登录 MySQL 后执行:
mysql> SHOW VARIABLES LIKE 'character%';mysql> SHOW VARIABLES LIKE 'collation%';
重点关注以下几项是否为 utf8mb4:
- character_set_server:服务器默认字符集(影响新建库)
-
collation_server:对应排序规则(推荐
utf8mb4_unicode_ci或utf8mb4_0900_as_cs) - character_set_client / character_set_connection / character_set_results:客户端通信三件套,应统一为 utf8mb4
二、永久修改 MySQL 配置文件(关键步骤)
编辑 MySQL 主配置文件(Linux 通常是 /etc/my.cnf 或 /etc/mysql/my.cnf;Windows 是 my.ini),在 [mysqld] 和 [client] 段落中添加或修正:
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake = ON
[mysql]
default-character-set = utf8mb4
⚠️ 注意:
– 必须重启 MySQL 服务生效(sudo systemctl restart mysql)
– skip-character-set-client-handshake 可防止应用层错误设置覆盖服务端配置
– 不要用 init_connect='SET NAMES utf8mb4' 替代全局配置,它对 SUPER 权限用户无效
三、修复已有数据库和表的字符集
配置生效后,旧库/表不会自动转换,需手动升级:
- 修改数据库默认字符集:
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; - 修改单个表(含字段):
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 只改表结构不改数据(更安全):
ALTER TABLE tbl_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
✅ 建议操作前备份;若字段原为 utf8 且含四字节 emoji,用 CONVERT TO 才能真正重编码。
四、应用连接层也要配对
即使 MySQL 端设好了,程序连接时仍可能出问题。常见场景:
-
PHP PDO:DSN 中加
;charset=utf8mb4,例如:$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', $u, $p); -
Java JDBC:URL 加参数:
jdbc:mysql://localhost:3306/test?characterEncoding=utf8mb4&serverTimezone=UTC -
Python PyMySQL/MySQLdb:连接时指定:
charset='utf8mb4' -
命令行客户端:启动时加
--default-character-set=utf8mb4,或在[mysql]段配置
? 小技巧:连接后立即执行 SET NAMES utf8mb4; 可临时校准会话层三字符集(但不如配置文件+连接参数可靠)。










