应修改服务端用户认证插件为mysql_native_password——mysql 8.0默认caching_sha2_password导致navicat、node.js等旧客户端连接失败,需用select查mysql.user确认plugin值,再用alter user 'user'@'host' identified with mysql_native_password by 'pwd'修正,并flush privileges。

直接改服务端用户认证插件,别升级客户端——90% 的情况是 MySQL 8.0 默认用了 caching_sha2_password,而你的 Navicat、Node.js mysql 包、PyMySQL 或旧版 PHP mysqli 根本不认这个协议。
查当前用户的 plugin 是不是 caching_sha2_password
用能连上的方式(比如本地命令行 mysql -u root -p)登录后执行:
SELECT host, user, plugin FROM mysql.user WHERE user = 'your_user';
- 重点关注你实际连接用的那条记录:host 是
'localhost'和'%'是两套配置,必须分别检查 - 别只看
root,应用代码里连的是哪个用户,就查哪个 - 如果
plugin列值是caching_sha2_password,基本坐实问题根源 - 错误码如
1251(Navicat)、ER_NOT_SUPPORTED_AUTH_MODE(Node.js)都指向这里
用 ALTER USER 切回 mysql_native_password
对出问题的用户执行一条语句即可,例如:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
- 必须带单引号,
'root'@'localhost'是完整标识符,写成root@localhost会报错 - 如果是远程连接(比如云服务器),host 很可能是
'%',得改成'root'@'%' - 密码明文写在语句里,确保和你要在客户端填的一致
- 执行完建议立刻补一句
FLUSH PRIVILEGES;,虽然多数情况自动生效,但保险起见
云数据库或 Docker 环境下别碰 my.cnf
有些教程让你在 my.cnf 的 [mysqld] 段加 default_authentication_plugin=mysql_native_password,再重启 MySQL —— 这招在阿里云 RDS、腾讯云 CDB 或多数 MySQL Docker 镜像里根本无效。
- 云数据库通常禁用全局配置修改权限
- 即使改了,也只影响之后新建的用户,已有用户的
plugin不变,还得单独ALTER USER - 生产环境开全局降级,等于放弃
caching_sha2_password带来的传输加密增强和密码缓存优化
真正卡住人的,从来不是命令敲不对,而是查 mysql.user 时没盯住 host 字段的具体值、ALTER USER 时漏了单引号、或者在云数据库上白费力气改配置文件。











