直接改.env文件配置数据库,DB_HOST必须用127.0.0.1而非localhost(避免socket连接失败),MySQL 8+需将用户认证插件降级为mysql_native_password,改完后执行php artisan config:clear并删除bootstrap/cache/config.php才能生效。

直接改 .env 文件,别碰 config/database.php —— 它只是读取环境变量的中转层,改了也不生效。
DB_HOST 写 localhost 就连不上?
是的,localhost 在 MySQL 里会触发 Unix socket 连接,但 Laravel 的 PDO 默认走 TCP。如果 MySQL 没启用 socket 或权限没开,就会卡在 SQLSTATE[HY000] [2002] Connection refused。
-
DB_HOST必须写成127.0.0.1(强制走 TCP) - Docker 环境下,容器里写
localhost是指自己,不是宿主机;要连宿主机 MySQL,得用宿主机 IP 或host.docker.internal(Mac/Windows)或自定义 Docker 网络网关(Linux) - 云服务器或宝塔上,确认 MySQL 是否监听
*:3306而非仅127.0.0.1:3306:运行netstat -tuln | grep :3306查看
MySQL 8+ 连不上,十有八九是认证插件问题
Laravel 8 及更早版本的 pdo_mysql 驱动不支持 MySQL 8 默认的 caching_sha2_password 插件,会静默失败或卡认证。
- 不要升级 PHP 或换驱动——
mysqlnd在 PHP 7.4–8.2 仍不原生支持该插件 - 重置用户密码并指定旧插件:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass'; - 新建用户时就指定:
CREATE USER 'new_user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass'; - 执行完记得
FLUSH PRIVILEGES;
改完 .env 为什么还是连旧配置?
因为 Laravel 把 .env 解析结果缓存进了 bootstrap/cache/config.php。只要之前跑过 php artisan config:cache,新配置就完全不会加载。
- 开发阶段最省事:运行
php artisan config:clear(清内存缓存) + 手动删掉bootstrap/cache/config.php(删文件才彻底) - 验证是否生效:进
php artisan tinker,执行config('database.connections.mysql.host'),看返回值是不是你刚写的127.0.0.1 - 密码含特殊字符(如
@、/、$)时,必须用单引号包裹整个值:DB_PASSWORD='p@ss/w0rd',否则dotenv解析失败
DB_DATABASE 必须是已存在、大小写完全匹配的库名;Laravel 不建库,也不报“库不存在”的友好提示,而是抛 SQLSTATE[HY000] [1049] Unknown database。Linux 环境下尤其要注意大小写。


















