1251错误本质是认证协议不匹配,mysql 8.0默认使用caching_sha2_password插件,而旧版navicat不支持该协议,导致握手失败;可通过select user,host,plugin from mysql.user where user='root'确认插件类型。

1251错误本质是认证协议不匹配
不是密码错、不是网络不通,而是MySQL 8.0默认用caching_sha2_password插件做身份验证,而旧版Navicat(比如15及更早)压根不认识这个协议——握手阶段就直接断开,抛出1251 - Client does not support authentication protocol requested by server。
怎么确认当前用户用了哪个认证插件
连进MySQL命令行后执行这条查询:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
重点关注plugin列的值。常见情况有:
- 如果显示
caching_sha2_password,且你的Navicat版本较老,基本就是它了 -
host字段必须严格匹配:远程连接用的是'root'@'%',就不能只改'root'@'localhost' - 云数据库(如阿里云RDS、腾讯云CDB)可能禁用
ALTER USER操作,得走控制台或工单
ALTER USER语句最容易写错的三个地方
这条命令看着简单,但漏掉一个细节就会白忙活:
- 必须显式写
WITH mysql_native_password,只写IDENTIFIED BY 'xxx'不会改插件,密码倒是重置了 -
'root'@'%'和'root'@'localhost'是两个独立账户,远程连不上时别忘了查并改后者 - Docker环境首次启动后,MySQL服务可能还没完全ready,立刻执行
ALTER USER会报Access denied,建议等5秒再试
为什么不能长期依赖mysql_native_password
回退到mysql_native_password只是权宜之计,因为:
- 它用SHA-1哈希,盐值仅20字节,而
caching_sha2_password用SHA-256 + 32字节盐值 + 内存缓存 - 新插件强制要求SSL传输密钥,旧插件可选,中间人攻击风险更高
- Navicat 16+、PHP 8.0+、PyMySQL 1.0+ 已原生支持
caching_sha2_password,升级客户端才是根本解法
真正容易被忽略的点是:很多团队在Docker里搭MySQL 8.0,顺手配好utf8mb4字符集,却忘了认证插件这层——它不报错、不告警,只在第一次连Navicat时冷不丁给你个1251。











