【问题标题】:How to resolve the error: SQL authentication method unknown in Laravel-MySql如何解决错误:Laravel-MySql 中的 SQL 身份验证方法未知
【发布时间】: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 版中的问题,欢迎。谢谢。
  • stackoverflow.com/a/58615936/6312647 Ubuntu 中查看我的答案

标签: php docker docker-compose laravel-5.5 mysql-8.0


【解决方案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

      1. 将默认认证插件添加到/etc/mysql/my.cnf

        [mysqld]
        default_authentication_plugin= mysql_native_password
        
      2. 如下登录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

        【讨论】:

          猜你喜欢
          • 2012-12-03
          • 2013-02-27
          • 1970-01-01
          • 2014-04-04
          • 2017-10-28
          • 1970-01-01
          • 2015-09-07
          • 2021-11-17
          相关资源
          最近更新 更多