如何解决Laravel连接MySQL时出现的SQL认证方法未知错误?
解决Laravel 5.5连接MySQL 8.0的认证方法错误问题
这个错误的核心原因很明确:MySQL 8.0默认启用了caching_sha2_password认证插件,但Laravel 5.5对应的PHP数据库驱动(比如mysqlnd)还不支持这种新的认证方式,导致连接时出现兼容性问题。下面给你两种直接可行的解决办法:
方法一:修改Docker Compose配置,让MySQL默认兼容旧认证规则
直接在你的docker-compose.yml的mysql服务中添加默认认证插件的参数,修改后的完整配置如下:
version: "2" services: mysql: image: mysql ports: - "3307:3306" command: --sql_mode="" --default-authentication-plugin=mysql_native_password
修改完成后,重启MySQL容器生效:
docker-compose down && docker-compose up -d
这样后续创建的所有数据库用户都会默认使用mysql_native_password认证,Laravel就能正常建立连接了。
方法二:手动修改已有数据库用户的认证方式
如果已经为Laravel创建了专属的数据库用户,可以直接进入MySQL容器修改该用户的认证规则:
- 先进入MySQL容器(替换
[你的mysql容器名/ID]为实际名称或ID):
docker exec -it [你的mysql容器名/ID] mysql -u root -p
- 执行SQL命令调整用户认证方式(替换
your_laravel_user和your_password为你Laravel配置里的数据库用户名和密码):
ALTER USER 'your_laravel_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES;
执行完成后退出容器,Laravel就能正常连接数据库了。
最后补充个小提醒:Laravel的.env配置里,DB_HOST要填写docker-compose中mysql服务的名称(也就是mysql),而不是localhost;端口用容器内部的3306即可,外部映射的3307是给宿主机连接用的,容器间通信不需要用这个端口。
内容的提问来源于stack exchange,提问作者andreszam24
相关产品推荐
相关产品推荐

