数据库连不上本质是底层连接链路断了:先确认mysql服务运行、db_host/port/db_database/db_username/db_password四参数正确且无拼写错误,密码含特殊字符需单引号包裹;改.env后必须php artisan config:clear;用php -r "var_dump(pdo::getavailabledrivers());"和db::connection()->getpdo()验证pdo层是否通畅;常见错误sqlstatehy000为服务未启动或网络不通,[1045]为认证失败,[2054]为mysql 8认证插件不兼容。

数据库连不上,不是 Laravel 有问题,而是底层连接链路断了。先确认服务在跑、参数对得上、认证能通过,再谈框架配置。
检查 .env 配置是否写对
关键四行必须齐全且无拼写错误:
- DB_CONNECTION=mysql(不能写成 mysqli、pdo_mysql 或留空)
- DB_HOST=127.0.0.1(Docker/Homestead/Laradock 环境下别用 localhost;远程库或 Laradock 推荐 host.docker.internal)
- DB_PORT=3306(MAMP 是 8889,XAMPP 是 3306,Docker 映射端口要核对 docker ps -a 输出)
- DB_DATABASE=your_db_name(库名必须已手动创建,Laravel 不自动建库)
密码含 @、$、/、:、? 等字符时,必须用单引号包裹整个值,例如:DB_PASSWORD='p@ss/w0rd:123'
不加引号或用双引号,dotenv 会误解析变量或截断。
改完 .env 后必须清缓存
Laravel 启动后会把 .env 读进内存并缓存,改了文件也不生效。执行:
-
php artisan config:clear(清除配置缓存) - 如果用了 OPCache,再补一句:
php artisan optimize:clear - 验证是否生效:进
php artisan tinker,运行config('database.connections.mysql.host'),看输出是不是你刚填的值
注意:不要用 config:cache,它会把 .env 锁死,开发阶段禁用。
绕过 Laravel 直连 PDO 验证真实问题
用最轻量方式定位是“参数错”还是“服务没起来”:
- 终端执行:
php -r "var_dump(PDO::getAvailableDrivers());"→ 确保输出含mysql - 运行
php artisan tinker,输入:DB::connection()->getPdo();
✅ 成功返回一个 PDO 实例 → 连接通了
❌ 抛出PDOException→ 错误在底层,不用查模型或查询构造器 - 更彻底的办法:写个
test-pdo.php,内容为:<?php new PDO("mysql:host=127.0.0.1;port=3306;dbname=test", "user", "pass"); ?>
直接php test-pdo.php运行,报什么错就看什么错——排除所有 Laravel 干扰
常见错误码对应的真实原因
看到报错别慌,先看 SQLSTATE 前缀:
-
SQLSTATE[HY000] [2002] Connection refused → MySQL 没启动 / Docker 容器没跑 / DB_HOST 地址不对 / 防火墙拦截
检查命令:systemctl status mysql(Linux)、brew services list | grep mysql(Mac)、docker ps | grep mysql -
SQLSTATE[HY000] [1045] Access denied → 用户名密码错 / MySQL 用户授权不匹配 host
例如 DB_HOST=127.0.0.1,但用户只定义了'user'@'localhost',需补授:GRANT ALL ON db.* TO 'user'@'127.0.0.1' IDENTIFIED BY 'pass'; FLUSH PRIVILEGES; -
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client → MySQL 8 默认插件 caching_sha2_password 不兼容老 PHP
临时解决:ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES;
不复杂但容易忽略











