直接修改用户认证插件即可解决navicat连接mysql 8.0报错1045问题,关键需精确匹配目标用户的host值(如'root'@'127.0.0.1'而非'localhost'),执行alter user语句并flush privileges生效。

直接改用户认证插件就能连上,不用重装、不用升级客户端,但必须确认目标用户(比如 root)的 Host 值和你实际连接时用的 host 一致,否则改了也白改。
怎么查当前用户的认证插件
登录 MySQL 后执行:
SELECT User, Host, plugin FROM mysql.user;重点关注你要连的那个用户行,比如
root 对应的 plugin 是不是 caching_sha2_password。注意 Host 列可能是 localhost、127.0.0.1 或 % —— Navicat 默认走 TCP 连接,很可能匹配的是 127.0.0.1 而不是 localhost,这点常被忽略。
ALTER USER 语句必须带 Host 精确匹配
常见错误是只改了 'root'@'localhost',但你实际用 Navicat 连的是 127.0.0.1,结果还是报错。正确做法是:
- 先确认你连接时填的主机名或 IP,Navicat 连接窗口里显示的是什么就按什么来
- 如果填的是
127.0.0.1,就得执行:ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'your_password';
- 如果填的是
localhost,才用:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
- 如果想一劳永逸支持任意 host(仅限开发环境),可设为
%:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
改完必须执行 FLUSH PRIVILEGES;,否则不生效。
docker 部署 MySQL 8 时的预设坑
如果你用 docker run 或 docker-compose.yml 启动 MySQL 8,默认仍可能生成 caching_sha2_password 用户。解决方法有两个:
- 启动容器时加参数:
--default-authentication-plugin=mysql_native_password - 或者在
docker-compose.yml的command中指定:command: --default-authentication-plugin=mysql_native_password - 更稳妥的做法:容器启动后立刻进容器执行上面的
ALTER USER+FLUSH PRIVILEGES,因为配置项只影响新创建的用户,对已存在的 root 不起作用
最易被忽略的一点:MySQL 8.0+ 的 localhost 和 127.0.0.1 在权限系统里是两个完全不同的 host 条目,不能互相覆盖。连不上时别只盯着密码,先查 SELECT User, Host FROM mysql.user; 看看到底匹配哪一行。











