很多人在使用 MySQL 命令行查询时遇到中文乱码、问号、方块等问题,本质原因一句话总结:终端编码、MySQL 客户端连接编码、数据库表存储编码三者不匹配。推荐统一使用 utf8mb4(MySQL 原生utf8是 utf8mb3,不支持 emoji,尽量不要使用)。
排查优先级:先确认客户端连接编码 → 再确认终端编码 → 最后核对库和表存储编码。如果原始数据字节已经损坏,单纯改显示编码无法修复。
一、查看当前 MySQL 字符集配置
登录 MySQL 后执行这条 SQL,查看全套字符集变量:
SHOW VARIABLES LIKE 'character_set_%';
重点关注这三个变量,控制查询结果返回给终端的编码:
character_set_client:客户端发送语句的编码character_set_connection:连接层编码转换character_set_results:服务端返回结果的编码
二、临时修复(当前连接生效,快速验证)
这是最常用的临时方案,执行之后再查询中文,大部分场景立刻恢复正常:
SET NAMES utf8mb4;
SET NAMES utf8mb4等价一次性设置上面三个客户端编码变量。
👉 Windows CMD 特殊场景:CMD 默认编码是 GBK。如果不想切换控制台编码,可以执行:
SET NAMES gbk;
三、登录时直接指定编码(每次登录自动生效)
登录命令带上编码参数,省去每次手动执行 SET NAMES:
mysql -uroot -p --default-character-set=utf8mb4
指定直接进入某个数据库:
mysql -uroot -p 库名 --default-character-set=utf8mb4
四、Windows 控制台编码切换(终端层面)
Windows CMD/PowerShell 本身也有编码限制,可通过 chcp 命令切换:
# 查看当前控制台编码
chcp
# 切换为 UTF-8(代码页65001)
chcp 65001
# 切回默认 GBK(代码页936)
chcp 936
注意:老版本 CMD 使用 65001 存在中文输入 bug,PowerShell 兼容性更好。
五、永久全局配置(my.ini/my.cnf,改完重启 MySQL)
Windows:my.ini
Linux:/etc/my.cnf 或 /etc/mysql/my.cnf
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci
修改配置文件后,重启 MySQL 服务:
# Windows
net stop mysql
net start mysql
# Linux
systemctl restart mysqld
六、检查数据库、数据表本身存储编码
如果客户端编码、终端编码全部调对依然乱码,大概率是库 / 表本身存储编码不对。
# 查看数据库编码
SHOW CREATE DATABASE 库名;
# 查看数据表编码
SHOW CREATE TABLE 表名;
转换已有库、表字符集(已有数据时执行):
ALTER DATABASE 库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
七、进阶定位:区分「显示乱码」和「数据本身损坏」
这一步可以精准判断问题根源:
SELECT HEX(字段名) FROM 表名 LIMIT 1;
- 返回十六进制如
E6B189这类 UTF-8 字节:数据本身没问题,只是终端 / 客户端显示编码不匹配 - 返回字节已经是
3F(问号):入库的时候编码就已经损坏,无法通过修改客户端配置修复
八、排查流程(推荐顺序)
- 登录后先执行
SET NAMES utf8mb4;,再查询。正常 → 仅客户端连接编码问题 ✅ - 依旧乱码:用
chcp核对终端编码,终端编码和SET NAMES保持一致 - 还不行:检查库、表字符集,确认存储为
utf8mb4 - 最后用
HEX()校验原始字节,判断数据是否已经损坏
九、高频踩坑提醒
- MySQL 里没有
utf-8,正确写法是utf8mb4,不要写错; - MySQL 的
utf8是阉割版 utf8mb3,不支持 emoji、部分生僻字; - 只改
[mysqld]服务端配置,不配置[client],命令行登录默认还是 latin1,照样乱码; - 应用程序连接数据库时,连接串编码也要同步为
utf8mb4,避免入库就乱码。