navicat连接mysql 8.0报2059或1251错误,因默认认证插件caching_sha2_password不兼容,需执行alter user 'root'@'%' identified with mysql_native_password by 'pwd'; flush privileges;并确保容器端口正确映射至宿主机。
navicat 连接报 2059 或 1251 错误:caching_sha2_password 不兼容
这是 mysql 8.0 默认认证插件导致的,navicat(尤其旧版)不支持 caching_sha2_password,必须手动切回 mysql_native_password。
进入容器执行 SQL 时,注意两个关键点:
-
root用户默认只允许'root'@'localhost',远程连接需先创建或修改'root'@'%'(或指定 IP)用户 - 不能只改密码,必须显式指定
IDENTIFIED WITH mysql_native_password
正确命令示例:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';<br>FLUSH PRIVILEGES;
如果提示 User 'root'@'%' does not exist,先用 SELECT user, host FROM mysql.user; 查看实际存在的 host;若只有 localhost,可先创建:CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; GRANT ALL ON *.* TO 'root'@'%'; FLUSH PRIVILEGES;
用宿主机 IP + 映射端口连接,而不是容器 IP
绝大多数情况下,不该用 docker inspect 查容器 IP 配 Navicat——那只是 Docker 内网地址,宿主机上的 Navicat 根本访问不到。
你应该直接使用:
- Windows/macOS:填
127.0.0.1或localhost(前提是容器端口已映射到宿主机) - Linux(非 WSL):同样填
127.0.0.1,但需确认宿主机防火墙放行映射端口(如3306或3307) - WSL2 用户注意:
localhost在 WSL2 里指向的是 WSL2 自身,不是 Windows 宿主机,此时应填 Windows 主机的真实局域网 IP(如192.168.x.x),并确保 MySQL 容器绑定了0.0.0.0(默认满足)
启动容器时务必带 -p 3306:3306(或自定义宿主端口),否则端口不通是必然的。
容器启动后无法连接?检查三个硬性条件
Navicat 连不上,90% 是卡在这三处,按顺序排查:
-
docker ps确认容器状态是Up,不是Exited;若已退出,用docker logs看错误(常见因配置挂载冲突、datadir权限不足、conf.d文件语法错) - 宿主机是否运行了另一个 MySQL(占用了
3306)?启动容器时用-p 3307:3306避开,并在 Navicat 端口栏填3307 - MySQL 容器内是否监听了所有接口?默认是的,但若挂载了自定义
my.cnf,检查是否有bind-address = 127.0.0.1——这会拒绝外部连接,应改为0.0.0.0或删掉该行
Mac / Windows 上 Navicat 填什么 IP 和端口最稳?
别折腾容器 IP、Docker 网络模式或 WSL 动态地址。最简方案就是:
- 启动容器时明确指定宿主端口映射,例如:
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql8 -d mysql:8.0 - Navicat 连接设置中:
- 主机名/IP 地址:
127.0.0.1 - 端口:
3306(与-p左侧一致) - 用户名:
root - 密码:启动时设的密码(如
123456)
- 主机名/IP 地址:
唯一例外是 macOS 使用 Rosetta 或 Apple Silicon 芯片且遇到 M1/M2 兼容问题时,可能需拉取 mysql:8.0-arm64v8 镜像;但只要 docker run 成功,其余流程完全一致。
加密方式切换和端口映射这两步漏掉任意一个,Navicat 就不可能连上——其他配置都是锦上添花,这两项才是门槛。











