laravel数据库连接必须配置在.env文件,db_host应设为127.0.0.1(避免localhost触发unix socket)、密码含特殊字符需用引号包裹、mysql 8需降级认证插件为mysql_native_password,并执行php artisan config:clear清除缓存。

直接改 .env 就行,config/database.php 不用动——它只是读取环境变量的“中转站”,改了也不会生效,还会在部署时被覆盖。
DB_HOST 写 localhost 就连不上?
MySQL 8+ 默认禁用 Unix socket 连接,localhost 会强制走 socket,而 Laravel 的 PDO 默认走 TCP。结果就是报 SQLSTATE[HY000] [2002] Connection refused。
-
DB_HOST必须写127.0.0.1(强制 TCP) - 如果用 Docker,宿主机 MySQL 在本机,容器内不能写
localhost——那是容器自己,得写宿主机 IP 或用host.docker.internal(Mac/Windows)或自定义网络网关(Linux) - Docker Compose 场景下,服务名(如
mysql)才是正确的DB_HOST
密码含 @ / $ 等特殊字符时连接失败
dotenv 解析器遇到未引号包裹的 @、/、:、? 会误判为 URL 分隔符,导致 DB_PASSWORD 截断或解析为空。
- 必须用单引号或双引号包裹整个值:
DB_PASSWORD='p@ss/w0rd'或DB_PASSWORD="p@ss/w0rd" - 别在
.env里写注释行紧挨着配置项,比如# 生产密码下一行直接跟DB_PASSWORD=...,某些旧版 dotenv 会把注释当值的一部分 - 验证方式:运行
php artisan tinker后执行env('DB_PASSWORD'),看输出是否完整
MySQL 8 连接卡住或报 Access denied
不是密码错了,是认证插件不兼容。caching_sha2_password 是 MySQL 8 默认插件,但 PHP 的 pdo_mysql(直到 PHP 8.2)仍不原生支持。
- 登录 MySQL 执行:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass'; - 然后
FLUSH PRIVILEGES; - 别尝试升级 PDO 驱动或打补丁——PHP 官方没计划在 8.x 系列中支持该插件,硬刚只会浪费时间
- 如果必须用 caching_sha2_password(如云厂商限制),只能换连接方式:用
mysqli+ 自定义连接逻辑,或加一层 ProxySQL 代理
改完 .env 还连不上?缓存没清干净
Laravel 启动时会把 .env 值固化进 bootstrap/cache/config.php。只要执行过 php artisan config:cache,后续所有 .env 修改都无效。
- 开发阶段最稳妥操作:
php artisan config:clear(清内存缓存) + 手动删掉bootstrap/cache/config.php(删文件更彻底) - 验证是否生效:
php artisan tinker→config('database.connections.mysql.host'),返回值必须是你刚写的127.0.0.1 - 别信 “我重启了服务器”,FPM 进程不 reload,缓存还在;Swoole/PHP-PM 更要手动 stop/start
最容易被忽略的是:Laravel 从不自动创建数据库,DB_DATABASE 对应的库必须已存在,且大小写完全一致(Linux 下区分大小写)。连之前先手动 CREATE DATABASE your_db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











