如何解决错误: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 身份验证方法未知的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 Pyspark 中的分析异常错误

如何解决 Access 中的此查询错误?

如何解决 Azure DevOps 中的“堆栈跟踪错误”

如何解决 alfresco sdk 中的 alfresco webscripts 中的 CORS 错误?

如何解决 react-redux 中的此错误“错误:操作必须是普通对象。使用自定义中间件进行异步操作。”

如何消除 FPDF 中的这个错误?