1045错误主因是认证失败,需先查root@localhost是否存在(与root@127.0.0.1独立),再确认plugin是否为caching_sha2_password导致老客户端不兼容,最后排查localhost是否被解析为127.0.0.1引发协议匹配失败。

mysql -u root -p 卡密码后报 1045,先查 'root'@'localhost' 是否存在
MySQL 的权限匹配是 user+host 组合精确匹配的,'root'@'localhost' 和 'root'@'127.0.0.1' 完全是两个账号。很多重装、升级或脚本初始化操作只创建了 'root'@'127.0.0.1' 或 'root'@'%',却漏掉 localhost 这个关键 host——而 mysql -u root -p 默认走 Unix socket,强制匹配 'root'@'localhost'。
用已有权限账户(如 sudo mysql)登录后执行:
SELECT host, user FROM mysql.user WHERE user = 'root';
如果结果里没有 localhost 行,问题就在这里。别改密码,直接补账号:
CREATE USER 'root'@'localhost' IDENTIFIED BY '你的密码';GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;FLUSH PRIVILEGES;
plugin 是 caching_sha2_password?老客户端连不上 socket 就是它
MySQL 8.0+ 默认用 caching_sha2_password 插件,但本地命令行、PHP 7.x、旧版 Navicat 等不支持该插件,哪怕密码正确,也会在输入后立刻报 ERROR 1045 或 ERROR 2059。
确认当前插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
若 plugin 列显示 caching_sha2_password,需切回兼容插件:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';FLUSH PRIVILEGES;
注意:不能用 SET PASSWORD 或直接 UPDATE mysql.user,MySQL 8.0.4+ 已弃用。
localhost 被解析成 127.0.0.1?检查是否误走 TCP 导致匹配失败
有些系统(尤其是 Windows)或修改过 /etc/hosts 的环境,会把 localhost 解析为 127.0.0.1,但 MySQL 客户端仍按 socket 方式发起连接,此时即使权限表里有 'root'@'127.0.0.1',也完全不匹配。
验证方式:
- 运行
mysql -u root -p -h 127.0.0.1:能进 → 说明是 socket 解析问题 - 运行
mysql -u root -p -S /var/run/mysqld/mysqld.sock(Linux)或mysql -u root -p -S MySQL\MySQL Server 8.0\Data\mysql.sock(Windows):确认是否真走 socket - 临时绕过:
mysql -u root -p -h localhost --protocol=tcp
根本解法仍是确保 'root'@'localhost' 存在且插件兼容,而不是依赖 --protocol=tcp。
Navicat 或 PHP 连本地 MySQL 失败?别填 localhost
Navicat 在 Windows 下默认尝试命名管道或 shared memory,若 MySQL 未启用这些协议,就会 fallback 失败;PHP 的 mysqli 扩展若未显式指定 unix_socket,也可能行为不一致。
实操建议:
- Navicat 新建连接时,“主机名或IP地址”填
127.0.0.1,不是localhost - PHP 连接字符串中显式指定
mysqli://root:pass@127.0.0.1:3306/dbname,避免隐式解析 - 确认 MySQL 实际监听地址:执行
SELECT @@bind_address;,若为127.0.0.1或*,则127.0.0.1可用;若为localhost,可能仅监听 socket
最易忽略的一点:即使你只想本地开发,也别假设 localhost === 127.0.0.1 === socket,三者在 MySQL 权限、协议栈、配置层面是独立控制的。











