在 Windows 下使用 WSL(Windows Subsystem for Linux)开发越来越普遍,特别是结合前后端或全栈项目时,有些开发者选择在 Windows 本地安装数据库,而将开发环境放在 WSL 中。然而,这种架构下偶尔会遇到一个令人抓狂的问题:在 WSL 中无法通过 127.0.0.1 连接到本机的 MySQL 数据库。
别急,这其实是个常见问题,而且解决方法也并不复杂——只需几行命令就能搞定。本文就来分享这一问题的原理、表现以及解决方案。

一、问题现象
当你在 WSL 中运行一个项目(例如 Node.js、Python、Laravel 等)并尝试连接 Windows 主机上安装的 MySQL 数据库时,你可能会设置连接地址为:
host = 127.0.0.1
port = 3306
结果却报错:Connection refused 或 Can't connect to MySQL server on '127.0.0.1'。
二、问题根源
WSL 虽然运行在 Windows 之上,但它本质上是一个“类 Linux 的沙盒”,默认使用的是一个虚拟化的网络接口。因此,当你在 WSL 中使用 127.0.0.1,它指的是 WSL 自己的“回环地址”,并不等同于 Windows 的本地地址。
也就是说:
-
127.0.0.1在 WSL 中 → 是 WSL 自己 -
127.0.0.1在 Windows 中 → 是 Windows 主机
这就是为啥连接不上。
三、解决方法
步骤 1:查找 Windows 主机 IP 地址(可通过 WSL 访问的网卡 IP)
在 WSL 中运行如下命令:
ip route | grep default
输出类似如下:
default via 172.24.160.1 dev eth0
这里的 172.24.160.1 就是 Windows 主机的网卡地址,WSL 可以通过这个地址访问 Windows 上运行的服务。
步骤 2:使用这个地址替代 127.0.0.1
修改你的项目数据库配置,例如 .env 文件:
DB_HOST=172.24.160.1
DB_PORT=3306
然后再次运行项目,一般就能正常连接 MySQL 数据库了。
四、建议与补充
✅ 建议使用主机名访问
WSL2 中还可以尝试用特殊的主机名 host.docker.internal(某些版本支持)或 localhost.localdomain,也可能指向 Windows 主机。
DB_HOST=host.docker.internal
不过这种方式并不总是可行,仍建议使用实际的网卡 IP 地址。
🔁 IP 地址会变化
每次重启 WSL 网络或 Windows 后,这个 IP 地址可能会改变,因此建议写个脚本自动更新环境变量,或每次连接前手动查一下。
🧱 防火墙检查
确认 Windows 的防火墙未阻止 3306 端口,或者你允许了“来自专用网络的入站连接”。
五、总结
使用 WSL 做开发很方便,但有时也会遇到一些“桥接现实与虚拟”的奇怪问题。连接本机 MySQL 是一个典型案例,但只要理解了 127.0.0.1 的作用域差异,使用实际网卡地址就能完美解决。
希望本文能帮你解决 WSL 中 MySQL 连接失败的问题,节省大量排查时间。如果你也遇到类似“电脑疑难档案”,欢迎留言交流!

被折叠的 条评论
为什么被折叠?



