navicat连不上docker中mysql 8.0,95%因认证插件不匹配:mysql 8.0默认用caching_sha2_password,而旧版navicat(如12.x/14.x)仅支持mysql_native_password;需查用户plugin、对'localhost'/'127.0.0.1'/'%'三类host均执行alter user指定密码并flush privileges,且navicat连接时填127.0.0.1而非localhost。

Navicat 连不上 Docker 里的 MySQL 8.0,95% 是因为认证插件不匹配:MySQL 8.0 默认用 caching_sha2_password,而你用的 Navicat 版本(尤其是 12.x、14.x 或更早)只认 mysql_native_password。这不是密码错、端口错,也不是容器没起来——是双方“说的不是同一种验证语言”。
确认是不是 caching_sha2_password 导致的
进容器执行命令查真实用户配置:
docker exec -it mysql8 mysql -u root -p -e "SELECT user, host, plugin FROM mysql.user WHERE user = 'root';"
如果输出里 plugin 列是 caching_sha2_password,且你连的是 'root'@'localhost'、'root'@'127.0.0.1' 或 'root'@'%' 中任意一个,那基本就是它了。
注意:localhost 和 127.0.0.1 在 MySQL 里是两个独立用户,Navicat 填 localhost 时可能实际走的是 127.0.0.1(尤其在 Docker 场景下),所以得查全。
改用户认证插件必须带密码 + FLUSH PRIVILEGES
只执行 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password; 是危险操作:它会清空密码,导致你再也登不进数据库。
正确做法是显式指定密码,并对所有可能匹配的 host 都改:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_pass';ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'your_pass';ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass';- 必须紧接着执行:
FLUSH PRIVILEGES;
改完立刻退出重连,Navicat 缓存旧握手参数,不关掉重开很可能还是报错。
Docker 启动时加 --default-authentication-plugin 只管新用户
很多人在 docker run 里加了 --default-authentication-plugin=mysql_native_password 就以为一劳永逸,结果发现 root 还是连不上——因为这个参数只影响后续新建的用户,已存在的 root 用户的 plugin 字段完全不变。
适合场景:你准备从头建一套全新用户体系,或者用初始化 SQL 脚本自动创建用户;不适合救急改老用户。
如果你用 Docker Compose,也是一样逻辑:
command: --default-authentication-plugin=mysql_native_password
它不会帮你把 root 的认证方式从 caching_sha2_password 切过来。
Navicat 连接设置里别填 localhost
Docker 容器外的 Navicat 填 localhost,经常被系统解析成命名管道或共享内存连接,而 MySQL 容器默认不启用这些通道;填 127.0.0.1 才强制走 TCP,才能命中你刚改好的 'root'@'127.0.0.1' 用户。
另外检查三件事:
- 宿主机是否开放了 3306 端口(
firewall-cmd --list-ports或ufw status) - MySQL 容器启动时是否加了
-p 3306:3306,且没有被其他服务占着 - Navicat 密码字段有没有含
@、/、\等字符,这些容易被 URL 解析逻辑截断,先换纯数字字母密码快速验证
最常被忽略的点:改了认证插件却没改对应 host 的用户记录,或者改了但忘了 FLUSH PRIVILEGES,或者 Navicat 没重启——这三步缺一不可。











