PHP连接MySQL 8.0报错的解决办法

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: PHP连接MySQL 8.0报错的解决办法

作为资深的MySQL票友,最近我总在给8.0吹水,我们知数堂的MySQL课程去年也早就升级到8.0版本了。我的VPS老早就想升级了,无奈PHP版本太低,担心升级后有问题,所以一直没去折腾。这两天稍微得空,就开始折腾升级MySQL版本。

为了解锁最香新功能,我直接升级到了最新的MySQL 8.0.19版本:

[yejr@imysql.com]> \s
..
Using delimiter:    ;
Server version:        8.0.19 MySQL Community Server - GPL)
Protocol version:    10
...
Binary data as:        Hexadecimal

注意到上面的 Binary data as: Hexadecimal了吗,我前几天的文章 MySQL 8.0.19客户端的一个小变化 中介绍了这个新特性。

由于我的PHP还是相对较低的版本,MySQL 8.0相对于5.7版本,对PHP这些应用程序影响最大的就是账号认证方式,由此前的 mysqlnativepassword变成了 cachingsha2password。除了账号授权方式要保持使用 native 认证插件外,还有个要注意的默认使用的字符集还得保持用 utf8,否则可能会报告下面两种错误:

SQLSTATE[HY000] [2054] Server sent charset unknown to the client


或者是

SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

看到上面的报错不用慌,只需要修改下面两个MySQL参数即可:

#MySQL 8.0起默认字符集改成了utf8mb4,这造成PHP PDO连接报错
#只需要重新指定默认字符集为utf8即可,但这并不影响在MySQL里创建utf8mb4字符集的表
character-set-server = utf8

#指定账号认证plugin还使用native模式,否则PHP PDO连接握手时会报错
default_authentication_plugin = mysql_native_password

在MySQL 8.0下创建新账号时,需要先 CREATE USER并指定密码,然后再 GRANT授权,不能再像以前那样,可以直接用一条 GRANT 语句搞定 创建账号+指定密码+授权这三件事了,例如:

[yejr@imysql.com]> CREATE USER yejr@localhost identified with mysql_native_password by 'c97721c63c9fc077';
[yejr@imysql.com]> GRANT ALL ON yejr.* to yejr@localhost;

把MySQL从5.7到8.0的升级方案,建议如下:

  1. 先将当前的MySQL 5.7升级到最新子版本,例如5.7.29。
  2. 检查错误日志,确认没有任何表在升级过程中报错。
  3. 设置innodb_fast_shutdown=0,关闭5.7.29版本实例。
  4. 修改my.cnf参数,使之适应8.0版本,例如去掉 internal_tmp_disk_storage_engine 参数。
  5. 在my.cnf中增加参数 upgrade = AUTO,使得MySQL 8.0启动后能自动升级系统表和用户表。
  6. 检查确认MySQL 8.0实例启动过程中无其他报错。在升级过程中,我还发现如果使用drupal系统的话,可能还会有个报错:
PDOException: SQLSTATE[42000]: Syntax error or access violation: 1231 Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER' in lock_may_be_available() (line 167 of xx/includes/lock.inc).

那是因为在drupal代码中,连接mysql时顺便设置了SQLMODE,其中 NOAUTOCREATEUSER这个模式在8.0之后不复存在了,只需要微调下面的代码:

[root@yejr.me]# vim includes/database/mysql/database.inc

$connection_options['init_commands'] += array(
#注释掉本行代码,或者删除 NO_AUTO_CREATE_USER 模式即可
#'sql_mode' => "SET sql_mode = 'ANSI,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER'",
'sql_mode' => "SET sql_mode = 'ANSI,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO'",
);

好了,现在全站都升级到MySQL 8.0了,yeah✌️

enjoy MySQL 8.0。

全文完。

            </div>
AI 代码解读
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
176
分享
相关文章
【YashanDB知识库】YMP从mysql迁移到崖山,报错:服务器错误
【YashanDB知识库】YMP从mysql迁移到崖山,报错:服务器错误
【YashanDB知识库】MySQL和YashanDB 隐式转换不一致引起的报错
本文分析了在YashanDB中执行特定SQL语句时出现的类型转换错误问题,并对比了YashanDB、Oracle和MySQL 5.7的行为差异。问题源于隐式类型转换,当数值字段与非法数字字符串(如&#39;1,2&#39;)进行比较时,YashanDB和Oracle会报错,而MySQL 5.7虽不报错但会引发警告。通过调整SQL语句,避免数值与字符串直接比较,可有效解决问题。文章还详细解析了不同值表现不一致的原因,涉及执行计划和过滤条件的实际运行细节。
【YashanDB知识库】YMP从mysql迁移到崖山,报错:服务器错误
【YashanDB知识库】YMP从mysql迁移到崖山,报错:服务器错误
【YashanDB知识库】YMP从mysql迁移到崖山,报错:服务器错误
【YashanDB 知识库】MySQL 和 YashanDB 隐式转换不一致引起的报错
【YashanDB 知识库】MySQL 和 YashanDB 隐式转换不一致引起的报错
2024Mysql And Redis基础与进阶操作系列(4-2)作者——LJS[含MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法]
24MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法(4-2) 学不会你来砍我!!!
ORM对mysql数据库中数据进行操作报错解决
ORM对mysql数据库中数据进行操作报错解决
134 2
升级到MySQL 8.4,MySQL启动报错:io_setup() failed with EAGAIN
当MySQL 8.4启动时报错“io_setup() failed with EAGAIN”时,通常是由于系统AIO资源不足所致。通过增加AIO上下文数量、调整MySQL配置、优化系统资源或升级内核版本,可以有效解决这一问题。上述解决方案详细且实用,能够帮助管理员快速定位并处理此类问题,确保数据库系统的正常运行。
217 9
2024Mysql And Redis基础与进阶操作系列(6)作者——LJS[含MySQL 多表之一对一/多;多对多;多表联合查询等详解步骤及常见报错问题所对应的解决方法]
MySQL 多表之一对一/多;多对多;多表联合之交叉连接;内连接;左、右、外、满、连接;子查询及关键字;自连接查询等详解步骤及常见报错问题所对应的解决方法
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等