连不上 MySQL 主因是 .env 配置未生效、MySQL 认证插件不兼容(如 8.0+ 的 caching_sha2_password)或缓存未清除;DB_HOST 应统一用 127.0.0.1 而非 localhost,避免 Unix socket 冲突;密码含特殊字符需单引号包裹;Docker 中 DB_HOST 须用 host.docker.internal 或宿主机 IP;授权用户、防火墙及网络模式等细节常被忽视。

连不上 MySQL,90% 的问题出在 .env 配置没生效、MySQL 认证插件不兼容,或者根本没清缓存。别急着改 config/database.php,它只是个中转站。
DB_HOST 写 localhost 还是 127.0.0.1?
写 127.0.0.1。MySQL 在 Docker、远程服务器或新版(尤其是 8.0+)环境下,localhost 会强制走 Unix socket,而 Laravel 的 PDO 默认走 TCP,结果就是“Connection refused”或静默失败。
- 本地开发用 MAMP/XAMPP/WAMP:通常可接受
localhost,但统一写127.0.0.1更稳 - Docker 容器里连宿主机 MySQL:
DB_HOST不能是localhost(那是容器自己),得用宿主机网关如host.docker.internal或实际 IP - 密码含
@、/、:等字符:整个值必须用单引号包裹,例如DB_PASSWORD='p@ss/w0rd',否则dotenv解析失败,Laravel 拿到空密码
MySQL 8 连接报 SQLSTATE[HY000] [2054] 怎么办?
这是 caching_sha2_password 插件导致的,PHP 的 mysqlnd 驱动(Laravel 默认用它)在 PHP
- 临时解决(开发环境推荐):进 MySQL 执行
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES; - 长期方案(生产环境):升级 PHP 到 8.0.16+ 或 8.1.10+,并确认
pdo_mysql扩展已启用 - 别在
config/database.php的options里加认证相关参数——PDO 层根本不识别,白配
改完 .env 为什么还是连旧库?
因为 Laravel 缓存了配置。只要执行过 php artisan config:cache,后续所有请求都读 bootstrap/cache/config.php,.env 变动完全无效。
- 开发阶段务必每次改完
.env就运行php artisan config:clear - 验证是否生效:进
php artisan tinker,执行config('database.connections.mysql.host'),看输出是不是你刚填的值 - 如果仍不对,检查有没有多个
.env文件(比如.env.local覆盖了主文件),或 IDE 缓存了旧文件
怎么快速验证连接真通了,而不是靠 migrate 猜?
用 DB::connection()->getPdo()。它跳过查询构建器、模型、缓存,直连底层 PDO,成功返回对象,失败立刻抛异常,最干净。
- 在
php artisan tinker中执行,不要加任何 try-catch - 常见错误对应动作:
SQLSTATE[HY000] [1045]→ 检查用户名/密码/授权 host;[2002]→ 检查DB_HOST/DB_PORT是否可达(可用telnet DB_HOST DB_PORT测试);[1049]→ 确认DB_DATABASE库名已手动创建 - 想看完整错误堆栈?在
.env加一行DB_DEBUG=true
真正卡住人的地方,往往不是语法或路径,而是 MySQL 用户授权范围('user'@'127.0.0.1' 和 'user'@'localhost' 是两个用户)、SELinux/firewalld 拦了 3306、或者 Docker 网络模式让 localhost 指向了错误目标——这些细节比写几行配置花的时间多得多。


















