数据库配置错误会导致Laravel启动失败或连接被拒绝;.env中端口须为整数、密码含特殊字符需单引号包裹;修改后须执行php artisan config:clear;Docker/Homestead需正确设置DB_HOST;MySQL 8需改用户认证插件为mysql_native_password。

数据库配置文件 .env 里写错端口或密码会直接报错
Laravel 启动时读取 .env 中的 DB_HOST、DB_PORT、DB_DATABASE、DB_USERNAME、DB_PASSWORD,任一字段拼写错误、多空格、漏引号(尤其含特殊字符时),都会导致连接被拒绝或认证失败。
实操建议:
-
DB_PORT默认是3306(MySQL)或5432(PostgreSQL),别写成"3306"—— Laravel 会把它当字符串传给 PDO,而 PDO 要求整数端口 - 密码含
$、@、/等字符时,.env中必须用单引号包裹,比如DB_PASSWORD='pass@123$';双引号或不加引号会导致变量展开或解析中断 - 改完
.env后,必须运行php artisan config:clear,否则缓存的旧配置还在生效
php artisan tinker 连不上数据库?先验证底层 PDO 是否通
Artisan 命令走的是 Laravel 的配置层,但真正建连的是 PHP 的 PDO。如果连 tinker 都进不去,说明不是应用逻辑问题,而是基础连接链路断了。
实操建议:
- 在
tinker里执行DB::connection()->getPdo(),如果抛出PDOException,就说明 PDO 层已失败,不用往下查模型或查询构造器 - 跳过 Laravel,用原生 PHP 测试:写个
test-pdo.php,内容为new PDO("mysql:host=127.0.0.1;port=3306;dbname=test", "user", "pass");,直接运行看报什么错 —— 这能排除 Laravel 配置缓存、服务提供者加载等干扰 - 常见错误信息如
SQLSTATE[HY000] [2002] Connection refused,基本等于 MySQL 没在监听该地址+端口;SQLSTATE[HY000] [1045] Access denied则是账号密码或权限不对
Docker 或 Homestead 环境下 DB_HOST 不能填 localhost
容器内 PHP 进程访问宿主机 MySQL 时,localhost 指向容器自己的 loopback,不是宿主机。很多开发者卡在这一步,反复确认密码没错,却忘了网络拓扑变了。
实操建议:
- Docker Compose 场景下,
DB_HOST应填服务名,比如mysql(对应docker-compose.yml中的服务名),不是localhost或127.0.0.1 - Homestead 中,MySQL 在虚拟机里,PHP 也在虚拟机里,所以
DB_HOST=127.0.0.1是对的;但如果你从宿主机跑php artisan(比如 VS Code 终端没进 vagrant),那DB_HOST就得是192.168.10.10(Homestead 默认 IP) - Laravel Sail 用户注意:
sail artisan命令已在容器内执行,DB_HOST应设为mysql,且确保docker-compose.yml中mysql服务已定义并启动
MySQL 8 默认认证插件 change 导致 Laravel 8+ 连接失败
MySQL 8 安装后默认用 caching_sha2_password 插件,而老版本 PDO 扩展(尤其 PHP 7.x)不支持,Laravel 会静默失败或报 SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client。
实操建议:
- 登录 MySQL,执行
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass';,然后FLUSH PRIVILEGES; - 或者在创建用户时就指定:
CREATE USER 'laravel'@'%' IDENTIFIED WITH mysql_native_password BY 'secret'; - 不推荐降级 MySQL 全局插件,影响其他应用;也不建议升级 PHP 到 8.1+ 来硬扛 —— 项目稳定优先,改用户认证方式最直接
配置类问题最麻烦的不是找不到解法,而是错误信息太泛,比如 Connection refused 可能是端口错、防火墙挡、MySQL 没启、Docker 网络不通、甚至 SELinux 限制。动手前先确定「谁连谁」—— 是 PHP 进程连 MySQL 进程?它们在同一个网络命名空间吗?监听地址对吗?这些比翻 Laravel 文档更关键。


















