升级mysql8默认加密方式改变

升级mysql8默认加密方式改变

mysql8的默认密码加密方式是,caching_sha2_password,而低版本的默认的加密方式为 mysql_native_password。由于数据库升级,而导致php或者navicat无法连接到数据库,可以采用本文来解决。而且默认字符集由utf8变为了utf8mb4。

mysql8更改默认的加密方式为 mysql_native_password。

1、更改my.ini文件

增加下面一行:

default_authentication_plugin=mysql_native_password

下文为phpstudy提供的my.ini文件。

[mysql]
default-character-set=utf8

[mysqld]
port=3306
default_authentication_plugin=mysql_native_password
basedir=C:/phpstudy_pro/Extensions/MySQL8.0.12/
datadir=C:/phpstudy_pro/Extensions/MySQL8.0.12/data/
character-set-server=utf8
default-storage-engine=MyISAM

2、更改账号数据

如果已经创建了账号,可能账号的认证方式。

数据表 mysql.user,字段plugin修改为mysql_native_password方式,当然对应的密码也需要更新。

所以,可使用的命令:

USE mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;

步骤2才是关键。步骤1只是告诉mysql创建新账号时,使用mysql_native_password加密。

你以为上面这些就完了吗?不,如果是php5.6的话,还可能会出现字符集问题

PHP Warning:  PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers in /yd/vender/db/Database.php on line 28
SQLSTATE[HY000] [2054] Server sent charset unknown to the client. Please, report to the developersPHP Fatal error:  Call to a member function prepare() on null in /yd/service/AdvertPublishService.php on line 119

3、更改字符集

mysql8好像使用了utf8mb4的默认字符集。

大概需要添加以下4个配置,然后重启mysql。实际上我没有更改collation-server也行。另外,数据库的表采用的是Innodb utf8mb4的编码方案。

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8

上面的问题,主要解决php5.6的低版本,字符集不识别问题。对于php7好像不存在这个问题。

参考:

https://www.cnblogs.com/zl0372/p/weiqing.html

关于php7使用utf8mb4可以使用下列方式,采用

$pdo = new PDO('mysql:host=localhost;dbname=my_db', 'db_user', 'db_password', array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4',
));

参考:

https://segmentfault.com/q/1010000005872893