Laravel怎么连接数据库_Laravel配置MySQL连接教程【实战】

6次阅读

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

Laravel怎么连接数据库_Laravel配置MySQL连接教程【实战】

数据库配置文件在哪、改哪几项

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.phpmysql 配置里加 '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.cnfmysqld.cnf)里加:
    [client] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
  • config/database.phpmysql 驱动下确保 'charset' => 'utf8mb4''collation' => 'utf8mb4_unicode_ci'

改完配置记得重启 MySQL,已有表还得手动转换:ALTER table users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;。只改 Laravel 配置没用。

text=ZqhQzanResources