一、前言:最常见的诡异乱码问题
很多开发者都遇到过这种奇葩场景:mysql客户端、连接、结果编码全是 utf-8,但在 navicat 中查询中文乱码、表格筛选乱码、excel导入中文问号。
核心症结只有一个:character_set_server=latin1(服务端编码为拉丁字符集)。
本文一次性讲透:临时急救方案+永久根治方案,彻底解决所有navicat中文乱码问题。
二、乱码核心根源(99%人踩坑)
数据库典型异常编码分布:
- 客户端/连接/结果:utf8/utf8mb4(正常)
- 服务端核心:character_set_server = latin1(病根)
character_set_server 是mysql只读启动参数,无法通过sql命令临时修改,只能改配置文件+重启数据库生效,所有新建库、表都会默认继承该编码。
两种乱码一定要分清
✅ 字母乱码(汉å):可修复,仅客户端解析异常,数据本身未损坏。
❌ 问号乱码(???):不可逆,插入数据时被latin1截断丢失,只能重新导入备份数据。
三、全网通用三大错误误区
误区1:可通过set命令修改server编码
完全不行!执行 set character_set_server = utf8mb4; 会直接报错:只读变量无法修改,只能改配置重启。
误区2:客户端utf-8就不会乱码
服务端为latin1时,旧数据可临时修复显示,但新库、新表、新数据一定会变成问号损坏。
误区3:navicat查询和筛选共用会话
navicat顶部筛选器会新建独立会话,这就是「查询正常、筛选乱码」的核心原因。
四、临时急救(无需重启,立刻恢复显示)
适合线上应急、暂时无法重启数据库的场景,解决查询、筛选乱码。
操作步骤:
- 右键数据库连接 → 编辑连接 → 高级
- 取消「使用mysql字符集自动选择」
- 字符集选择 utf8mb4
- 初始化命令填入以下代码:
set names utf8mb4; set character_set_client=utf8mb4; set character_set_results=utf8mb4;
- 关闭所有数据库标签,重新打开连接即可生效
优缺点:即时生效、无需重启;仅当前连接有效,无法避免新数据存储乱码。
五、永久根治(一劳永逸,彻底解决乱码)
1. 修改mysql配置文件
windows修改my.ini,linux修改 my.cnf,替换完整配置:
[client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci init_connect='set names utf8mb4' skip-character-set-client-handshake
2. 重启mysql服务
- windows:服务列表重启mysql服务
- linux:
systemctl restart mysqld
3. 验证配置
执行sql,确保所有编码为utf8mb4:
show variables like 'character_set%';
4. 修复存量库表编码
# 修改数据库编码 alter database 库名 character set utf8mb4 collate utf8mb4_unicode_ci; # 转换数据表编码(保留原有数据) alter table 表名 convert to character set utf8mb4 collate utf8mb4_unicode_ci;
六、excel导入中文乱码专属解决方案
excel直接导入极易乱码,推荐最优方案:
- 将excel另存为 **csv utf-8(逗号分隔)**格式,兼容性最强,基本零乱码
- 导入时手动选择utf-8编码,不使用自动检测
- 手机号、数字长字段提前设置为文本格式,避免科学计数失真
- 确保目标数据表编码为utf8mb4
七、界面方框乱码解决(字体问题)
若中文显示为□方框,属于字体缺失,和编码无关:
- navicat工具 → 选项 → 记录
- 网格字体改为微软雅黑/noto sans cjk sc
- 重启navicat即可
八、快速排查清单(收藏备用)
- ✅ 服务端编码
character_set_server=utf8mb4 - ✅ navicat连接配置utf8mb4+初始化编码命令
- ✅ 数据库、数据表统一utf8mb4编码
- ✅ 数据导入优先使用utf-8 csv格式
- ✅ 界面异常优先更换中文字体、重连会话
结语
mysql中文乱码的核心从来不是客户端配置,而是服务端server编码不统一。临时set names只能解决显示问题,只有彻底修改服务端编码、统一全链路utf8mb4,才能从根源杜绝所有中文乱码问题。
以上就是navicat+mysql中文乱码的完整解决方案的详细内容,更多关于navicat+mysql中文乱码的资料请关注代码网其它相关文章!
发表评论