遇到 MySQL 8.0.11 的一些坑

遇到的坑

1、Authentication type:
用户的 Authentication type 默认为 caching_sha2_password,导致数据库连接错误,抛出如下异常:
Illuminate\Database\QueryException : SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
解决方案:修改密码认证方式
ALTER USER 'YOURUSERNAME'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YOURPASSWORD';

2、删除了 NO_AUTO_CREATE_USER 模式
在 5.7.*的日志中提到已废除该模式,在8.0.11中删除了,迁移时会抛出如下异常:
Illuminate\Database\QueryException : SQLSTATE[42000]: Syntax error or access violation: 1231 Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'

解决方案:将 config/database.php 配置文件中mysql 的 strict 的值改为false即可!
目前就发现这两个,如有有其他的坑可以评论一下:hand:

Deprecation and Removal Notes

Incompatible Change: These deprecated compatibility SQL modes have been removed: DB2, MAXDB, MSSQL, MYSQL323, MYSQL40, ORACLE, POSTGRESQL, NO_FIELD_OPTIONS, NO_KEY_OPTIONS, NO_TABLE_OPTIONS. They can no longer be assigned to the sql_mode system variable or used as permitted values for the mysqldump --compatible option.

Removal of MAXDB means that the TIMESTAMP data type for CREATE TABLE or ALTER TABLE is no longer treated as DATETIME.

For MySQL 5.7 applications that use SQL modes removed in MySQL 8.0, statements may fail when replicated from a MySQL 5.7 master to a MySQL 8.0 slave, or may have different effects on master and slave. To avoid such problems, applications that use modes removed in MySQL 8.0 should be revised to avoid them.

The following features related to account management have been removed:

Using GRANT to create users. Instead, use CREATE USER. Following this practice makes the NO_AUTO_CREATE_USER SQL mode immaterial for GRANT statements, so it too is removed.

Using GRANT to modify account properties other than privilege assignments. This includes authentication, SSL, and resource-limit properties. Instead, establish such properties at account-creation time with CREATE USER or modify them afterward with ALTER USER.

IDENTIFIED BY PASSWORD 'hash_string' syntax for CREATE USER and GRANT. Instead, use IDENTIFIED WITH auth_plugin AS 'hash_string' for CREATE USER and ALTER USER, where the 'hash_string' value is in a format compatible with the named plugin.

Additionally, because IDENTIFIED BY PASSWORD syntax has been removed, the log_builtin_as_identified_by_password system variable is superfluous and has been removed.

The PASSWORD() function. Additionally, PASSWORD() removal means that SET PASSWORD ... = PASSWORD('auth_string') syntax is no longer available.

The old_passwords system variable.

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 5年前 自动加精
讨论数量: 23
朕略显ぼうっと萌

厉害啊,老哥,我也全遇到了,

5年前 评论

基本上全遇上了。。。

5年前 评论

全遇上了.jpg :+1:

5年前 评论

本人刚开始学习MySQL和php 我也遇到了这两个问题 :+1:。
但是第二个问题,我没有找到config/database.php这个文件,我是从官网下载的mysql 8.0.11 x64 windows版本,免安装的。还请帮忙前辈指导一下。

5年前 评论
FBY-fan 4年前

@sunny-w Laravel 什么版本?

5年前 评论
FBY-fan 4年前
Atzcl

遇到了第二点,,,

5年前 评论

赞,多分享这些

5年前 评论

在哪里修改密码认证方式

5年前 评论
hezhizheng

。。。 今天刚好碰到这个两个问题,解决方法也是如此

5年前 评论

我遇见第一个问题了,心里苦~可是laravel还是连接不上,Heidisql能连接

5年前 评论

file

密码格式改了还是出现第一个问题怎么解

5年前 评论

@某某某 我这个只是针对用户设置的,不是全局使用mysql_native_password

5年前 评论

Storage engine 'MyISAM' does not support system tables. [mysql.user]

5年前 评论

两种问题都遇到了,但是都没解决问题 依然连不上 客户端可以连接上,没有修改身份验证模式的时候 laravel可以连接,客户端不行,修改该后 客户端可以 laravel 不行。

5年前 评论

@redrain 解决了可以在下面说明一下解决方案

5年前 评论

老哥厉害,我用 laradock ,自带的 mysql 是最新的,搞了一天了,google 也找不到解决方案,已经打算降版本试试了。在老哥这本来不抱希望的,结果解决了。

5年前 评论

ReflectionException (-1)
Class setEventDispatcher does not exist
老哥之前的项目根据你的教程已经可以run起来,不过有一个新的项目却一直报错找不到setEventDispatcher php7.3 mysql8.0 您有遇到过吗,google找了好久

5年前 评论

如果使用的是docker 启动mysql 的容器,用docker-composer文件启动的话,加入这行 command: --default-authentication-plugin=mysql_native_password,就不用去数据库里改。

5年前 评论

@Mortence 请问你是怎么改的呢?请赐教

4年前 评论
Mortence 4年前
Mortence 4年前
luca (作者) 4年前
luca (作者) 4年前
Mortence 4年前
luca (作者) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!