根本原因是mysql 8.0默认使用caching_sha2_password认证插件,旧版navicat不支持;需先查select user,host,plugin from mysql.user where user='root'确认插件类型,再严格按顺序执行alter user...password expire never、alter user...identified with mysql_native_password by...、flush privileges,并确保host匹配。

Navicat 连不上 MySQL 8.0,报错 1251 - Client does not support authentication protocol,根本原因是 MySQL 8.0 默认用 caching_sha2_password 认证插件,而旧版 Navicat(尤其是 15 及更早版本)不支持它。直接改用户认证方式最有效,但必须注意 host、权限和刷新时机。
查当前用户的 plugin 是不是 caching_sha2_password
先确认问题根源,别盲目执行 ALTER。用命令行登录 MySQL 后运行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
如果输出中 plugin 列是 caching_sha2_password,那就对了——这就是报错 1251 的直接原因。注意:host 值可能是 'localhost'、'127.0.0.1' 或 '%',后续操作必须跟这个值严格一致,否则改了也没用。
ALTER USER 必须分两步:先设永不过期,再切插件
很多用户只执行一条 ALTER USER ... IDENTIFIED WITH mysql_native_password BY ... 就报错,是因为 MySQL 8.0 对密码策略有强制要求。必须按顺序做:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_password' PASSWORD EXPIRE NEVER;ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';FLUSH PRIVILEGES;
缺一不可。第二步的 IDENTIFIED WITH 才真正切换认证插件;第一步确保不会因密码过期策略拦截操作;第三步让变更立即生效——漏掉 FLUSH PRIVILEGES 是常见失败原因。
连接失败还可能是 host 不匹配或权限未开
即使改了插件,Navicat 仍连不上?检查你填的主机名是否和 mysql.user 表里 host 字段完全一致:
- 如果表里是
'localhost',Navicat 连接时 Host 填127.0.0.1就会失败(Unix socket 和 TCP 是不同通道) - 想从远程连,得确保有
'root'@'%'或'root'@'192.168.x.x'这条记录,且它的plugin也已改成mysql_native_password - 没有对应 host 记录?先用
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd';,再GRANT ALL ON *.* TO 'root'@'%';
Docker 环境尤其容易踩这个坑:容器内 MySQL 默认只建 'root'@'localhost',外部 Navicat 必须走 TCP,所以必须显式创建并授权 'root'@'%' 用户。
长期方案其实是升级或换驱动,不是倒退协议
把认证插件降级到 mysql_native_password 是临时解法,牺牲了 SHA-256 加密、防重放攻击等安全能力。生产环境不建议长期使用。更可持续的做法是:
- 升级 Navicat 到 v16 或更高版本(官方从 v16 起完整支持
caching_sha2_password) - 或者手动更新 Navicat 内置的 MySQL 驱动(路径类似
Navicat.app/Contents/Frameworks/libmysqlclient.dylib,需替换为 MySQL 8.0+ 提供的 lib) - 若必须保旧版 Navicat,至少确保 MySQL 开启 SSL,并在 Navicat 连接设置里勾选 “Use SSL”——因为
caching_sha2_password强制要求加密传输
真正麻烦的不是改一条 SQL,而是搞清你连的是哪个 host、用的是哪条 user 记录、有没有被密码策略卡住——这三个点漏掉一个,1251 就还在那儿等着你。











