数据库连不上通常是 .env 中 db_host、db_port、db_database 配置错误:db_host 应填 127.0.0.1(避免 unix socket)、db_port 需匹配实际端口(如 docker 可能是 3307)、db_database 必须为已存在且大小写精确匹配的库名。

数据库连不上,八成是 .env 里这三行写错了,不是 laravel 版本问题,也不是 mysql 服务没开。
怎么填 DB_HOST、DB_PORT 和 DB_DATABASE
本地开发最常踩的坑:把 DB_HOST 写成 localhost,结果 Laravel 默认用 Unix socket 连,但你的 MySQL 实际监听的是 TCP —— 这时候会报 SQLSTATE[HY000] [2002] Connection refused。
-
DB_HOST填127.0.0.1(强制走 TCP),别填localhost -
DB_PORT别空着,默认是3306,但如果你用 Docker 或 MAMP,得查实它真正暴露的端口,比如3307 -
DB_DATABASE必须是已创建好的库名,Laravel 不会自动建库;大小写要和 MySQL 里完全一致(linux 环境区分大小写)
DB_USERNAME 和 DB_PASSWORD 的权限陷阱
很多人用 root 用户测试没问题,一换到生产环境就报 access denied for user。不是密码错了,是用户没被授权从当前 host 连接。
- 检查用户是否允许从
%或具体 IP 连接:select Host, User FROM mysql.user WHERE User = 'your_user'; - 如果只允许
localhost,而 PHP 是通过 TCP(即127.0.0.1)连的,就会失败 - 授予权限后别忘了
FLUSH PRIVILEGES;,否则不生效
为什么 php artisan migrate 找不到表,但 DB::select() 能查?
这是典型的配置缓存没刷新。Laravel 启动时会把 .env 加载进配置并缓存,改完 .env 后不清理缓存,新值根本不会生效。
- 每次改完
.env,必须运行:php artisan config:clear - 如果还用了
php artisan config:cache(常见于生产部署),那必须先config:clear,再config:cache - 验证是否生效:运行
php artisan tinker,然后输入config('database.connections.mysql.host'),看返回值是不是你刚写的127.0.0.1
最麻烦的不是配错哪一项,而是改了之后没清缓存,还反复检查 MySQL 密码——这种时候记得先敲一遍 config:clear。