php跟mysql进行连接过程中,如果连接失败_服务器空间PHP不支持MySql数据库

php跟mysql进行连接过程中,如果连接失败_服务器空间PHP不支持MySql数据库MySQL升级到8.0之后,PHP连接报错怎么解决? 作为资深的MySQL票友,最近我总在给8.0吹水,我们知数堂的MySQL课程去年也早就升级到8.0版本了。我的VPS老早就想升级了,无奈PHP版…

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

为了解锁最香新功能,我直接升级到了最新的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

代码100分

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

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

代码100分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 语句搞定 创建账号+指定密码+授权 这三件事了,例如:

代码100分[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。

全文完

由我主讲的知数堂「MySQL优化课」第17期已发车,我们的课程从第15期就升级成MySQL 8.0版本了,现在上车刚刚好,一起开启MySQL 8.0的修行之旅吧

另外,我在腾讯课堂MySQL性能优化》精编课程已完结,本课程讲解读几个MySQL性能优化的核心要素:合理利用索引,降低锁影响,提高事务并发度

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/8720.html

(0)
上一篇 2023-02-23
下一篇 2023-02-23

相关推荐

  • Excel中常用的文本函数,你知道几个?不妨来看看这8个[亲测有效]

    Excel中常用的文本函数,你知道几个?不妨来看看这8个[亲测有效]文本函数,也是Excel中的一类函数,在实际的工作中应用的也是非常普遍,你都知道几个?功能:从文本字符串中指定的起始位置起,返回指定长度的字符。

    2023-03-01
    96
  • Redis基本操作进阶篇-[亲测有效]

    Redis基本操作进阶篇-[亲测有效]Redis中的事务(transaction)是一组命令的集合。一个事务中的命令要么全部执行,要么都不执行。Redis的事务没有关系数据库事务提供的回滚(rollback)功能。

    2023-05-03
    97
  • oracle查询哪些表不为空_空集是0吗

    oracle查询哪些表不为空_空集是0吗1.分析所有表 select 'analyze table '||table_name||' compute statistics;' from user_tables

    2023-02-04
    101
  • Python中单引号和双引号的区别

    Python中单引号和双引号的区别Python是一种非常流行的编程语言,它简单易学,容易上手。在Python中,我们经常需要使用引号来包含字符串,但在这种情况下,Python支持两种不同类型的引号:单引号和双引号。这两种引号可以互换使用,但使用它们的方式有微小的差别。本文将介绍使用单引号和双引号的区别和如何选择正确的引号。

    2024-04-25
    11
  • Python – 实现添加列表元素的方法

    Python – 实现添加列表元素的方法Python的列表是一种非常常用的数据结构,用于存储一系列有序的数据。在实现列表的基本操作中,添加元素是一项非常重要的操作。Python提供了三种添加列表元素的方法:

    2023-12-30
    64
  • 写一手好SQL,你该从哪里入手?[通俗易懂]

    写一手好SQL,你该从哪里入手?[通俗易懂]有时候我们会遇到:在查询sql的时候,假如有100w条数据,会出现慢sql告警,这个时候你就应该到处sql日志来查找原因了。这里很有可能的主要原因就是没有命中索引和没有分页处理(原因有很多种,主要分…

    2023-02-18
    102
  • MySQL高性能优化规范建议,速度收藏[通俗易懂]

    MySQL高性能优化规范建议,速度收藏[通俗易懂]数据库命令规范
    所有数据库对象名称必须使用小写字母并用下划线分割

    所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)

    数据库对象的命名要能做…

    2023-03-21
    111
  • 爬虫使用代理的不同方式

    爬虫使用代理的不同方式爬虫代理动态转发与传统api提取的区别: 作为爬虫工作者我们最先接触到的代理的使用方式是通过传统API提取代理,程序通过URL定时获取代理IP信息,需验证IP的可用性、更换代理设置,同时需要设计多线…

    2023-04-13
    98

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注