萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 密码正确却报“用户名密码错误”排查实录:hosts 文件捣鬼

现象复现

  • PHP 脚本 mysql_connect("localhost", "root", "root") 报错 Database Server Password Error。
  • CMD 下 mysql -uroot -proot 却能正常登录。
  • 近期修改过 C:\Windows\System32\drivers\etc\hosts 文件。

根因分析

hosts 文件内容:

127.0.0.1    www.111cn.net

缺少 localhost 解析行。MySQL PHP 驱动解析 localhost 时,会尝试连接 Unix Socket(Linux)或 Named Pipe/Shared Memory(Windows)。若解析异常,可能回退 TCP 连接 127.0.0.1:3306,但主机名解析错误导致连接被拦截或路由至错误地址。

修复方案

方案一:修正 hosts 文件(推荐)

127.0.0.1    localhost
::1          localhost

保存后无需重启,PHP 脚本即刻恢复正常。

方案二:连接串显式指定 IP

mysql_connect("127.0.0.1", "root", "root")  -- 绕过主机名解析

深度补充

  • Windows 下 localhost 解析优先级:hosts → DNS → NetBIOS → LLMNR。
  • MySQL 客户端库(libmysql / mysqlnd)对 localhost 有特殊处理:尝试本地协议(Pipe/Socket),失败才走 TCP。127.0.0.1 强制走 TCP。
  • 若必须用域名,确保正反向解析一致,且 skip_name_resolve=OFF(默认)。

排查清单

  1. 确认 hosts 含 127.0.0.1 localhost 及 ::1 localhost。
  2. 确认 MySQL 监听 bind-address=0.0.0.0 或 127.0.0.1。
  3. 确认防火墙放行 3306 端口。
  4. 用 telnet 127.0.0.1 3306 测试 TCP 连通性。
  5. PHP 侧开启 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) 看详细异常。
copyright © 萬盛學電腦網 all rights reserved