如何解决错误:Laravel-MySql 中的 SQL 身份验证方法未知
Posted
技术标签:
【中文标题】如何解决错误:Laravel-MySql 中的 SQL 身份验证方法未知【英文标题】:How to resolve the error: SQL authentication method unknown in Laravel-MySql 【发布时间】:2018-11-05 22:43:20 【问题描述】:我使用 docker,我有一个 Laravel Framework 5.5.25 容器和其他带有 mysql Ver 8.0.11 for Linux on x86_64 (MySQL Community Server - GPL) 的容器。在我的 docker compose 配置中,我有这个:
version: "2"
services:
mysql:
image: mysql
ports:
- "3307:3306"
command: --sql_mode=""
所以,当 Laravel 尝试连接到 MySql 时,我遇到了这个错误:
SQLSTATE[HY000] [2054] 服务器请求客户端未知的身份验证方法(SQL: select * from
【问题讨论】:
目前我不得不回到 MySql 5.6 版。但如果有人知道如何解决 8.0 版中的问题,欢迎。谢谢。 在***.com/a/58615936/6312647 Ubuntu 中查看我的答案 【参考方案1】:对于 MySQL 8 和 php7+,您必须使用旧式密码:
ALTER USER 'username'@'ip_address' IDENTIFIED WITH mysql_native_password BY 'password';
【讨论】:
大家小心,这个命令可能会损坏你的mysql登录过程并得到Access denied for user 'username'@'ip_address'
,必须停止mysql并在安全模式下使用mysql来重置你的密码【参考方案2】:
对于使用 Laravel Valet 进行本地开发,我可以使用 TablePlus SQL 查询编辑器通过键入这个来解决这个问题
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mypassword';
我希望它也能帮助别人。
【讨论】:
【参考方案3】:我正在使用 laravel 5.8 并让 MAMP 服务器通过在 .env 文件中添加 DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
来解决此错误,如下所示
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=dbname
DB_USERNAME=root
DB_PASSWORD=root
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
正如我在一些博客中发现的那样,它通常是因为最新 MySQL 版本的套接字问题
【讨论】:
对于 unix,这将是DB_SOCKET=/var/run/mysqld/mysqld.sock
。这绝对是最干净的解决方案。谢谢!【参考方案4】:
如果您正在寻找 Laravel 方式,只需简单编辑 config/database.php
并将modes
数组添加到 MySQL 部分:
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env( 'DB_HOST', '127.0.0.1' ),
'port' => env( 'DB_PORT', '3306' ),
'database' => env( 'DB_DATABASE', 'forge' ),
'username' => env( 'DB_USERNAME', 'forge' ),
'password' => env( 'DB_PASSWORD', '' ),
'unix_socket' => env( 'DB_SOCKET', '' ),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
'modes' => [
'ONLY_FULL_GROUP_BY',
'STRICT_TRANS_TABLES',
'NO_ZERO_IN_DATE',
'NO_ZERO_DATE',
'ERROR_FOR_DIVISION_BY_ZERO',
'NO_ENGINE_SUBSTITUTION',
],
],
],
【讨论】:
【参考方案5】:参考:https://github.com/laradock/laradock/issues/1392#issuecomment-368308494
将默认认证插件添加到/etc/mysql/my.cnf
[mysqld]
default_authentication_plugin= mysql_native_password
如下登录mysql
创建新用户,
CREATE USER 'admin'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpass';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
CREATE USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY 'yourpass';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
#
CREATE DATABASE IF NOT EXISTS `yourdb` COLLATE 'utf8_general_ci' ;
GRANT ALL ON `yourdb`.* TO 'admin'@'%' ;
FLUSH PRIVILEGES ;
注意:删除旧用户、数据库并通过上述脚本重新创建。
【讨论】:
【参考方案6】:不要忘记生成应用程序密钥并将其分配给 .env 文件中的 APP_KEY 变量.
php artisan key:generate --show
然后清除缓存:
php artisan config:cache
【讨论】:
以上是关于如何解决错误:Laravel-MySql 中的 SQL 身份验证方法未知的主要内容,如果未能解决你的问题,请参考以下文章
如何解决 alfresco sdk 中的 alfresco webscripts 中的 CORS 错误?