根本原因是客户端与服务端字符集不一致,需依次检查并统一MySQL服务端、数据库、表、列及Navicat连接参数的字符集为utf8mb4,并确保Linux系统locale支持UTF-8。
Navicat 连接 Linux MySQL 时中文显示为问号或方块
根本原因是客户端与服务端字符集不一致,不是字体问题,也不是 navicat 设置错了界面语言。linux 上 mysql 默认可能用 latin1 或未显式配置 utf8mb4,而 navicat 发送的中文实际是 utf-8 编码,中间没对齐就乱码。
实操建议:
- 先确认 MySQL 服务端默认字符集:
SHOW VARIABLES LIKE 'character_set%';,重点关注character_set_server和collation_server - 临时改(重启失效):
SET GLOBAL character_set_server = 'utf8mb4'; SET GLOBAL collation_server = 'utf8mb4_unicode_ci'; - 永久生效要改 MySQL 配置文件(通常是
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),在[mysqld]下加两行:[mysqld]\ncharacter-set-server = utf8mb4\ncollation-server = utf8mb4_unicode_ci
- 别漏掉客户端部分:在同一个配置文件的
[client]段加上default-character-set = utf8mb4,否则本地mysql命令行连也会乱码
Linux 终端里 mysql 命令能正常显示中文,但 Navicat 还是乱码
说明服务端和命令行客户端字符集已对齐,问题出在 Navicat 自身连接参数没传对,或者数据库/表/列级字符集仍是旧的。
实操建议:
- Navicat 新建连接时,在「高级」页签下勾选
Use compression通常无关,但一定要检查「初始化命令」里有没有SET NAMES utf8mb4;—— 如果没有,手动加上 - 查当前库表字符集:
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'your_db'; - 如果库是
latin1,改库字符集:ALTER DATABASE your_db CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; - 已有表需单独改:
ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;(注意:大表会锁表,生产环境慎用)
Linux 系统 locale 不支持中文导致终端输出乱码,间接影响 Navicat 日志或调试
这不是 Navicat 的锅,但会影响你排查问题。比如用 mysqld --print-defaults 看配置时中文变乱码,或错误日志里汉字显示异常,容易误判为 MySQL 本身问题。
实操建议:
- 运行
locale,看输出里LANG是否含UTF-8(如en_US.UTF-8或zh_CN.UTF-8)。若显示POSIX或空,就是它了 - 临时生效:
export LANG=en_US.UTF-8(推荐 en_US.UTF-8,兼容性比 zh_CN.UTF-8 更稳) - 永久生效:编辑
/etc/default/locale(Ubuntu/Debian)或/etc/locale.conf(CentOS/RHEL),写入LANG="en_US.UTF-8",然后运行locale-gen(Debian)或localectl set-locale(RHEL) - 改完记得重启 MySQL:
systemctl restart mysql,否则新 locale 不会加载进 mysqld 进程环境
Navicat 用 SSH 隧道连 Linux MySQL,隧道建立后仍乱码
SSH 隧道只转发 TCP 流量,不改变字符集协商逻辑。乱码依旧说明 MySQL 服务端或连接参数没配对,和是否走隧道无关。
实操建议:
- 确认隧道目标地址是
127.0.0.1:3306(不是localhost),因为 MySQL 对localhost会走 socket 连接,绕过网络层字符集协商 - Navicat 连接设置中「主机」填
127.0.0.1,不是localhost;端口填隧道本地监听端口(如3307) - 检查 Linux 上 MySQL 是否绑定了
127.0.0.1:netstat -tlnp | grep :3306,若只显示::1(IPv6)或没输出,需在my.cnf中设bind-address = 127.0.0.1 - 防火墙一般不影响,但若用
ufw,确保没拦本地回环:sudo ufw status,乱码问题里它基本不背锅
字符集配置是分层的:服务器 > 数据库 > 表 > 列 > 连接。任何一个环节掉链子,中文就断在半路。最容易被忽略的是连接初始化命令和表级字符集转换,而不是一上来就改系统 locale。










