db_connection必须设为mysql等合法驱动,db_host禁用localhost而应写127.0.0.1以强制tcp连接;密码含特殊字符须用单引号包裹;修改.env后必须执行php artisan config:clear并确认bootstrap/cache/config.php已删除。

DB_CONNECTION 必须设为 mysql(或对应驱动),且 DB_HOST 别写 localhost——MySQL 8+ 默认禁用 socket 连接,localhost 会走 socket 路径,直接报错。
DB_HOST 写 localhost 就连不上?
这是 MySQL 8+ 最常被忽略的兼容性陷阱。PDO 在连接 localhost 时强制走 Unix socket,而新用户默认不授权 socket 访问,也不匹配认证插件。
- 改
DB_HOST=127.0.0.1,强制走 TCP/IP,绕过 socket 限制 - 确认 MySQL 配置中
skip-networking是关闭状态(my.cnf或mysqld.cnf) - 如果必须用
localhost,得在 MySQL 里显式授权:GRANT ALL ON *.* TO 'user'@'localhost'; FLUSH PRIVILEGES;
密码含 @ / $ 等特殊字符就报错?
.env 文件由 vlucas/phpdotenv 解析,遇到未引号包裹的 @、/、:、$ 会被误判为 URL 分隔符或变量插值符号。
- 必须用单引号包裹整个值:
DB_PASSWORD='p@ss/w0rd',不是双引号 - 双引号会触发 PHP 变量展开,比如
DB_PASSWORD="$PASS"会被替换成空值 - 验证方式:运行
php artisan tinker后输入env('DB_PASSWORD'),看输出是否完整
改完 .env 为什么还是连不上?
Laravel 会把 .env 加载结果缓存进 bootstrap/cache/config.php,只要执行过 php artisan config:cache,后续修改 .env 就完全无效。
- 开发阶段永远先跑
php artisan config:clear,它清内存缓存 + 删除 config.php 文件 - 别只依赖
config:clear—— 检查bootstrap/cache/下是否还残留config.php,手动删掉更保险 - 部署环境若用了
config:cache,上线前必须重新生成缓存,不能只改.env
SQLSTATE[HY000] [1045] Access denied 怎么定位?
这个错误不是 Laravel 的锅,是 MySQL 层面拒绝了凭证或权限。PDO 不会告诉你具体原因,得靠组合排查。
- 先确认用户是否存在:
SELECT User, Host FROM mysql.user WHERE User = 'your_user'; - 检查该用户是否允许从当前 host 连接(比如 Laravel 运行在 Docker 容器,host 应是容器 IP 或
%) - MySQL 8+ 用户默认用
caching_sha2_password插件,Laravel 旧版 PDO 不支持,必须重置:ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass'; - 临时加
DB_DEBUG=true到.env,让 Laravel 显示原始 PDO 错误信息
关键点不在“怎么配”,而在“改了之后有没有真正生效”——缓存、解析、认证插件、网络路径,四个环节任何一个卡住,都会表现为“连不上”,但根因完全不同。











