laravel数据库配置在.env文件,必须修改db_connection、db_host、db_port、db_database四项,并确保用户名密码正确;mysql 8+需处理认证插件兼容性、网络连接及utf8mb4字符集统一。

数据库配置文件在哪、改哪几项
Laravel 的数据库配置集中在 .env 文件里,不是 config/database.php —— 后者只是读取环境变量的中间层,直接改它没用,还会在部署时被覆盖。
必须改的四项是:
-
DB_CONNECTION=mysql(确认是 mysql,不是 sqlite 或 pgsql) -
DB_HOST=127.0.0.1(别写 localhost,MySQL 8+ 默认禁用 socket 连接,localhost 会走 socket,导致连接失败) -
DB_PORT=3306(如果改过端口,这里必须同步) -
DB_DATABASE=your_db_name(库名要真实存在,Laravel 不自动创建)
用户名和密码也要核对,尤其是密码含特殊字符(如 @、/)时,得用引号包住:DB_PASSWORD="p@ss/w0rd",否则 URL 解析会出错。
执行 php artisan migrate 报 “Access denied”
这不是 Laravel 的错,是 MySQL 权限或认证插件问题。Laravel 用的是 PDO,默认走 mysql_native_password 插件,但 MySQL 8.0+ 新建用户默认用 caching_sha2_password,PDO 不兼容。
解决方法只有两个,选其一:
- 降级用户认证插件:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES;
- 或者在
config/database.php的mysql配置里加'options' => [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_SSL_MODE => PDO::SSL_NONE],再补上PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"—— 但这只是绕开,不解决根本。
别试“重装 MySQL”或“换 PHP 版本”,99% 是这个插件不匹配。
本地连得上,线上报 “Connection refused”
常见于 Docker、云服务器、宝塔等环境。核心就两点:端口没开、服务没监听外网。
检查顺序:
- 运行
netstat -tuln | grep :3306,看是否监听127.0.0.1:3306(只本机)还是*:3306(全网);如果是前者,改 MySQL 配置bind-address = 0.0.0.0 - 云服务器(阿里云/腾讯云)安全组必须放行 3306 端口,且规则方向为“入方向”
- Docker 容器跑 MySQL 时,确保
-p 3306:3306映射了端口,并且容器内 MySQL 没设skip-networking - 宝塔面板默认关闭外部访问,得在数据库管理页点“远程访问”并填
%
别在 .env 里把 DB_HOST 写成 localhost 然后指望它连宿主机 —— Docker 容器里 localhost 是自己,不是宿主机。
中文存进去变成问号,或查出来乱码
不是 Laravel 编码设置的问题,是 MySQL 层面的字符集没对齐。Laravel 默认用 utf8mb4,但很多老库或一键安装包仍用 utf8(实际是 utf8mb3),不支持 emoji 和部分生僻字。
必须三处统一:
- 数据库创建时指定:
CREATE DATABASE your_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- MySQL 配置文件(
my.cnf或mysqld.cnf)里加:[client] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
-
config/database.php中mysql驱动下确保'charset' => 'utf8mb4'、'collation' => 'utf8mb4_unicode_ci'
改完配置记得重启 MySQL,已有表还得手动转换:ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;。只改 Laravel 配置没用。










