MySQL 命令行查询中文乱码完整排查方案

13次阅读
没有评论

很多人在使用 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(问号):入库的时候编码就已经损坏,无法通过修改客户端配置修复

八、排查流程(推荐顺序)

  1. 登录后先执行 SET NAMES utf8mb4;,再查询。正常 → 仅客户端连接编码问题 ✅
  2. 依旧乱码:用 chcp 核对终端编码,终端编码和 SET NAMES 保持一致
  3. 还不行:检查库、表字符集,确认存储为 utf8mb4
  4. 最后用 HEX() 校验原始字节,判断数据是否已经损坏

九、高频踩坑提醒

  1. MySQL 里没有 utf-8,正确写法是 utf8mb4,不要写错;
  2. MySQL 的 utf8 是阉割版 utf8mb3,不支持 emoji、部分生僻字;
  3. 只改 [mysqld] 服务端配置,不配置 [client],命令行登录默认还是 latin1,照样乱码;
  4. 应用程序连接数据库时,连接串编码也要同步为 utf8mb4,避免入库就乱码。
正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码