连接MySQL报错1251

连接MySQL时报错:

1251-Client does not support authentication protocol requested by server; consider upgrading MySQL client

客户端不支持服务器请求的认证协议;考虑升级MySQL客户端

该如何解决呢?

原因及解决方法

mysql8 之前的版本中加密规则是 mysql_native_password,而在 mysql8 之后,加密规则是 caching_sha2_password。所以要把mysql用户登录密码加密规则还原成mysql_native_password

  1. 登录mysql客户端:
1
mysql -u root -p 
  1. 执行以下命令:
1
2
alter user 'root'@'localhost' identified with mysql_native_password by 'password';
flush privileges;

'root'就是用户名,'localhost'就是用户的访问权限,'password'就是用户密码。

如果出错:

ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost'

则执行以下语句查看用户权限:

1
2
use mysql;
select user, host form user;
1
2
3
4
5
6
7
8
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+-----------+

可以看到,这里用户root的访问权限为%,即任意远程主机都可访问,而不是默认的localhost

所以上文中第二步执行的命令也要注意修改用户名权限

1
2
alter user 'root'@'%' identified with mysql_native_password by 'password';
flush privileges;

搞定。

还报错?

ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'%'

没办法,试试以下操作吧,不知道行不行。把代表密码的authentication_string字段先置为空,然后再设置符合策略的密码:

1
2
3
4
update user set authentication_string='' where user='root';
flush privileges;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
flush privileges;

flush privileges;可以不执行,不过可能会出错,自己试试吧。

参考文章

解决Navicat连接MySQL出现1251-Client does not support authentication protocol requested by server; - 知乎 (zhihu.com)

MySql错误 1251 - Client does not support authentication protocol requested by server 解决方案_阿燃i的博客-CSDN博客_华为

ERROR 1396 (HY000): Operation ALTER USER failed for ‘root‘@‘localhost‘_JAVA|Mr.Java的博客-CSDN博客

MySql8.0修改root密码_wolf131721的博客-CSDN博客_mysql8.0修改root密码