Laravel数据库配置文件在.env中,需修改DB_CONNECTION、DB_HOST、DB_PORT、DB_DATABASE、DB_USERNAME、DB_PASSWORD等变量;config/database.php仅作中转,不应硬编码。

数据库配置文件在哪、改什么
Laravel 的数据库连接信息全在 .env 文件里,不是 config/database.php。后者只是读取环境变量的“中转站”,硬编码在这里反而会掩盖问题、导致本地和线上不一致。
常见错误是直接去改 config/database.php 里的 'host' 或 'database',结果 .env 里配错了却查半天——Laravel 默认优先用 .env,改了 PHP 配置文件也没用。
要改就只动 .env,关键几行必须对齐:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=your_db_name DB_USERNAME=your_db_user DB_PASSWORD=your_password
注意:如果 MySQL 跑在 Docker 或远程服务器上,DB_HOST 别写 localhost(它会走 socket),换成 127.0.0.1;密码含特殊字符(比如 @、/)要 URL 编码,否则 parse_url() 解析失败,报错 SQLSTATE[HY000] [1045] Access denied。
测试连接是否真通了
php artisan tinker 里敲 DB::connection()->getPdo(); 最直接。它不走查询缓存,也不依赖模型,就是裸连——成功返回 PDO 实例,失败立刻抛异常,比跑 php artisan migrate 快得多。
容易踩的坑:
- 没执行
php artisan config:clear就改了.env,Laravel 还在用旧配置缓存 - MySQL 用户没授权从当前 host 连接,比如用户只允许
'user'@'localhost',但 Laravel 用的是127.0.0.1,得加一条'user'@'127.0.0.1' - SELinux 或防火墙拦了 3306 端口(尤其 CentOS / Rocky),
telnet your-host 3306都不通,PHP 当然连不上
MySQL 8 默认认证插件不兼容
新装 MySQL 8 默认用 caching_sha2_password,但 Laravel 8 及更早版本的 PDO MySQL 驱动不支持,连上就报 SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client。
解决方法只有两个:
- 降级用户认证方式(推荐开发环境):
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES;
- 升级 Laravel 到 9.2+ 并确保 PDO 扩展支持(生产环境谨慎,涉及 PHP 版本和驱动)
别试“加 options 参数绕过”,PDO 层根本不认这个插件,不是配置能救的。
多数据库怎么切、什么时候会连错
Laravel 支持多个连接,但默认只用 DB_CONNECTION=mysql 指定的那个。想切到另一个,得显式指定:
- 查询时:
DB::connection('pgsql')->table('users')->get(); - 模型里:
protected $connection = 'pgsql'; - 迁移时:
php artisan migrate --database=pgsql
最容易出问题的是队列或命令行任务——它们可能在不同连接下运行,但模型没声明 $connection,结果写进了默认库。比如你有个 Notification 模型本该写进日志库,却因为没设 $connection,悄悄混进了主业务库。
还有个隐藏点:如果你在 config/database.php 里给某个连接写了 'prefix' => 'log_',但 .env 里又覆盖了 DB_PREFIX,那所有连接都会被这个全局前缀污染,除非你在每个连接数组里把 'prefix' 显式设为空字符串。
环境变量加载顺序、连接复用机制、PDO 生命周期——这些地方不深挖,表面看着通,一并发就丢数据。


















