升级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',
));
参考: