根本原因是MySQL 8.0默认认证插件caching_sha2_password与旧版Navicat不兼容;需执行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pwd' PASSWORD EXPIRE NEVER并FLUSH PRIVILEGES,再查mysql.user表确认plugin已更新。
Navicat 连接 MySQL 8.0 报 1251 错误的根本原因
不是 navicat 坏了,也不是 mysql 配置错了,而是双方“说的密码语言不一样”:mysql 8.0 默认用 caching_sha2_password 插件加密用户密码,而 navicat 12 及更早版本只认老协议 mysql_native_password。客户端一尝试握手,服务器报出 client does not support authentication protocol requested by server,本质是认证协议不兼容。
ALTER USER … IDENTIFIED WITH mysql_native_password 必须带 host 和密码
光写 ALTER USER 'root' IDENTIFIED WITH mysql_native_password 是无效的——MySQL 要求明确指定用户+主机组合,且必须重设密码(即使想保留原密码,也得再输一遍)。常见错误包括:
- 漏掉
@'localhost'或@'%',导致改错用户(比如改了'root'@'127.0.0.1'却用localhost连) - 只执行
IDENTIFIED WITH没跟BY 'xxx',语句会报错ERROR 1827 (HY000): The password cannot be empty - 没加
PASSWORD EXPIRE NEVER,某些环境里新密码会被立即标记为过期,连上去提示需要重置
正确写法示例:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_pass' PASSWORD EXPIRE NEVER; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_pass';
FLUSH PRIVILEGES 不是可选步骤,它直接影响连接生效
MySQL 的权限系统缓存在内存中。ALTER USER 会更新 mysql.user 表,但不自动刷新运行时权限缓存。不执行 FLUSH PRIVILEGES,Navicat 仍会按旧插件尝试认证,错误照旧。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 该命令必须在
USE mysql;之后或任意库下单独执行,无依赖顺序 - 执行后无输出即成功;若提示
Query OK,说明已加载新配置 - 重启 MySQL 服务也能达到同样效果,但没必要——
FLUSH PRIVILEGES更快、更轻量
检查 plugin 字段确认是否真正生效
改完别急着开 Navicat,先验证数据库里用户实际用的是哪个插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
看到 plugin 列值为 mysql_native_password 才算成功。如果还是 caching_sha2_password,说明前面某步没执行到位,比如用了错误的 host、权限不足没写入、或者连错了实例(本地有多个 MySQL 服务时容易搞混)。
特别注意:有些一键安装包(如 XAMPP、MAMP)自带独立 MySQL 实例,命令行连的可能是系统级 MySQL,而 Navicat 默认连的是套件内置服务——host、端口、用户表都可能不同。

















