navicat连mariadb中文乱码90%因字符集未对齐,须同步校准服务端(my.cnf设utf8mb4并重启)、连接层(navicat连接属性选utf8mb4+set names utf8mb4)和客户端(禁用缓存、换中文字体),缺一不可。
navicat 连接 mariadb 出现中文乱码,90% 是字符集没对齐,不是字体或 navicat 版本问题;必须同时校准服务端、连接层、客户端三处编码,缺一不可。
确认 MariaDB 服务端是否真正支持 utf8mb4
报错 Unknown character set: 'utf8mb4' 或还原 SQL 时直接失败,说明 MariaDB 启动时根本没加载 utf8mb4 字符集——这不是 Navicat 能改的。先验证:
- 执行
SHOW VARIABLES LIKE 'character_sets_dir';,拿到路径后进该目录,检查是否存在utf8mb4.xml - 若缺失,不能只复制重命名,还要编辑
Index.xml新增一行:<collation name="utf8mb4_unicode_ci" id="224" charset="utf8mb4"></collation>(id 必须查现有最大值后 +1) - 改完必须重启 MariaDB:
sudo systemctl restart mariadb,再运行SHOW CHARACTER SET LIKE 'utf8mb4';确认返回结果 - 别信
SET GLOBAL character_set_server = utf8mb4—— 它不持久,且 Navicat 新建连接不会继承这个值
修改 my.cnf 配置强制默认字符集
MariaDB 默认仍可能用 latin1 创建库/表,即使你手动指定 CHARACTER SET utf8mb4,也容易漏掉。必须在配置文件中固化:
- 编辑
/etc/my.cnf.d/server.cnf(CentOS/RHEL)或/etc/mysql/mariadb.conf.d/50-server.cnf(Ubuntu/Debian) - 在
[mysqld]段下添加两行:character-set-server = utf8mb4collation-server = utf8mb4_unicode_ci - 在
[client]段下加:default-character-set = utf8mb4 - 重启生效;注意:仅改
[mysqld]不够,[client]缺失会导致 Navicat 连接初始协商用错编码
Navicat 连接设置里“编码”选什么才有效
Navicat 的「高级」→「编码」下拉框对 MariaDB 来说,**必须选 utf8mb4,不是 UTF-8,也不是 utf8**:
-
utf8在 MariaDB 中是旧版 3 字节编码,不支持 emoji 和部分生僻汉字,选了等于白设 - 如果下拉菜单里没有
utf8mb4,说明 Navicat 版本太老(v12 以前),必须升级,或改用连接字符串参数:charset=utf8mb4 - 勾选「运行前执行命令」,填入:
SET NAMES utf8mb4;—— 这能兜底解决首次查询前未初始化的问题 - 测试连接成功 ≠ 字符集协商成功;务必执行
SHOW VARIABLES LIKE 'character_set_client';和SELECT @@collation_connection;双重验证
结果网格显示问号或方块?先关缓存再换字体
所有字符集都对了,但结果里中文还是显示为 ? 或小方块,大概率是 Navicat 渲染层卡在旧缓存或字体 fallback 上:
- 关闭「工具」→「选项」→「查询」里的「启用查询结果缓存」,然后完全退出 Navicat(不只是关窗口),再重开 —— 这个缓存会固化错误编码解析结果,是“重启无效”的最常见原因
- Windows 用户换字体:设置 → 常规 → 字体 → 改成
Microsoft YaHei或SimSun;Linux 用户改用Noto Sans CJK SC,别用DejaVu Sans - Linux 下还必须检查系统 locale:
locale | grep -E "LANG|LC_CTYPE",如果不是zh_CN.UTF-8或类似 UTF-8 值,Navicat 界面控件本身就会乱码
最容易被跳过的其实是服务端字符集注册和客户端初始化命令的配合——只改配置不重启,或只设 Navicat 编码不加 SET NAMES,都会导致某一层悄悄 fallback 到 latin1。三处对齐后,再验证一次 SHOW VARIABLES LIKE 'character_set%'; 的全部 6 行输出,确保 client、results、connection 全是 utf8mb4。











