Navicat报ERROR 1045时,若显示'root'@'localhost',主因是host匹配失败或认证插件不兼容;应检查root用户host值是否仅为localhost、新增'root'@'127.0.0.1'并设mysql_native_password插件、Navicat主机填127.0.0.1而非localhost。
检查root用户的host值是否为localhost而非%
navicat 报 error 1045 时,如果错误里明确写着 'root'@'localhost',说明 mysql 已识别到你这个用户,但拒绝登录——大概率不是密码错,而是该用户只被允许从 localhost 连(即本机 unix socket 或 127.0.0.1),而 navicat 默认走 tcp/ip,哪怕填的是 127.0.0.1,mysql 也可能按 'root'@'127.0.0.1' 匹配失败。
验证方式:用命令行登录后执行:
SELECT user, host FROM mysql.user WHERE user = 'root';
若只看到 root + localhost,没有 % 或具体 IP 行,就无法远程(含 Navicat 本地 TCP)连接。
- 不建议直接把
localhost改成%(改表风险高,且 MySQL 8.0+ 的host匹配逻辑更严格) - 正确做法是新增一条:用
GRANT创建'root'@'%'或'root'@'127.0.0.1'用户 - 执行后必须跟
FLUSH PRIVILEGES;,否则不生效
MySQL 8.0 必须显式指定认证插件为 mysql_native_password
MySQL 8.0 默认用 caching_sha2_password 插件,但老版本 Navicat(如 15 及更早)不支持,会直接报 1045 或连带 ERROR 2059。即使密码、权限都对,也会卡在这一步。
修复不是“换密码”,而是换插件:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
如果要同时支持本地 socket 和 TCP 连接,建议补上:
ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY '你的密码';
- 不能用
SET PASSWORD或旧式UPDATE user SET authentication_string=...,MySQL 8.0.4+ 已弃用 - 执行完必须
FLUSH PRIVILEGES;,否则插件切换不生效 - Navicat 连接时,“密码”字段要真实填写,不能留空或填错大小写
Navicat 连接设置中主机填 127.0.0.1 而非 localhost
这是最容易被忽略的实操细节。Windows 下 localhost 默认走命名管道或 shared memory,而 MySQL 服务若没启用这些,就会 fallback 失败;127.0.0.1 强制走 TCP,路径更确定。
- 在 Navicat 新建连接窗口,“主机名或IP地址”栏填
127.0.0.1,不是localhost - 端口确认是 MySQL 实际监听的(默认
3306,但某些集成环境如 XAMPP 可能是3307) - 如果还连不上,用命令行验证:
mysql -h 127.0.0.1 -u root -p,看是否同样报1045
这步能快速区分问题是出在 Navicat 配置,还是 MySQL 权限/插件本身。
跳过权限验证前先确认 MySQL 服务名和启动方式
网上很多教程让运行 mysqld --skip-grant-tables,但在 MySQL 8.0+ 上,单独运行该命令常报错或无响应——它需要配合 --shared-memory 或 --console 才能绕过初始化检查。
更稳妥的做法是改配置文件:
- 找到
my.ini(Windows)或my.cnf(Linux/macOS),在[mysqld]段落下加一行:skip-grant-tables - 然后用系统服务重启 MySQL:
net stop mysql && net start mysql(注意服务名可能叫mysql80、MySQL57等,去services.msc里确认) - 改完务必删掉
skip-grant-tables并再次重启,否则数据库完全裸奔
真正麻烦的从来不是改哪条 SQL,而是改完之后忘了关调试模式,或者服务名写错导致以为改了其实没生效。











