如何在 Laravel 中运行 MySql 8?

12

我在使用MySQL 8时遇到了一些困难。每次尝试运行php artisan migrate时,都会出现以下错误。为此,我重新安装了MySQL一次,因为我不想再头疼这个问题了。我已经根据其他可能的答案编辑了database.php,但似乎也没有用。有一种可能的答案是,由于MySQL 8对根密码进行了sha256加密,这就是为什么我想回到与Laravel兼容的MySQL 5.7。虽然我希望保持软件包最新,并且只要能让它与laravel兼容,就想保留MySQL 8。

PHP 7.2

如何让MySQL 8与Laravel合作?

 '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' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'version' => 8,
            'modes' => [
                'ONLY_FULL_GROUP_BY',
                'STRICT_TRANS_TABLES',
                'NO_ZERO_IN_DATE',
                'NO_ZERO_DATE',
                'ERROR_FOR_DIVISION_BY_ZERO',
                'NO_ENGINE_SUBSTITUTION',
            ],
        ],

``

Illuminate\Database\QueryException  : SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (SQL: select * from information_schema.tables where table_schema = laravel_tut and table_name = migrations)

  at /Users/home/Projects/laravel_tut/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|         }
    668|

  Exception trace:

  1   PDOException::("PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]")
      /Users/home/Projects/laravel_tut/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=laravel_tut", "root", "fdgkadgaf9g7ayaig9fgy9ad8fgu9adfg9adg", [])
      /Users/home/Projects/laravel_tut/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

我另外一个修复方案更新: 在MySQL的全新安装中,我选择了NO来对密码进行加密设置(使用传统的加密方式,而不是SHA加密),这样就可以在Laravel中无任何问题地使用它——只需使用一个长而强的密码即可。 安装步骤参考: https://www.percona.com/blog/wp-content/uploads/2018/05/Installing-MySQL-8.0-on-Ubuntu-2.png


2
好的,Laravel 实际上并没有直接与 MySQL 进行接口交互,而是通过某种插件(PDO)处理连接。因此,首先请告诉我们您使用的 PHP 版本,您可以尝试 这个链接 或者 官方文档。MySQL 8 看起来不太容易被 PDO 支持。 - Bagus Tesa
2个回答

35

由于PHP不支持 caching_sha2_password,请将用户设置为 mysql_native_password:

ALTER USER 'forge'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'new_password'

3
我在 my.ini 文件中加入了 default_authentication_plugin=mysql_native_password 并删除了旧的 caching_sha2_password 值,这对我有效。 - endo64
当我使用MySQL 8.0+并进行Magento 2.3.1网站安装时,这对我很有效。如果您不想进行其他更改,请不要忘记在命令的末尾添加“;”字符。 - Seb

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接