MySQL 8.0新用户默认用不了mysql_native_password,因其default_authentication_plugin设为caching_sha2_password,该配置仅影响CREATE USER时未显式指定插件的新用户;若需新用户直接使用mysql_native_password,必须在CREATE USER语句中显式声明IDENTIFIED WITH mysql_native_password。

为什么新用户默认用不了 mysql_native_password?
MySQL 8.0 默认启用了 caching_sha2_password 插件,它比旧的 mysql_native_password 更安全,但很多老客户端(比如某些 PHP 版本、Navicat 旧版、Docker 中的 legacy 驱动)不支持或需额外配置才能连。你遇到“Access denied for user”或客户端报错“Client does not support authentication protocol”,大概率就是这个原因。
修改已有用户的认证方式(推荐 ALTER USER)
直接改用户插件最稳妥,不需要重置密码(除非你顺手想改):
ALTER USER 'your_username'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
注意点:
-
'your_username'@'%'要和你实际创建时的 host 一致,常见的是'localhost'或'%',查用SELECT User, Host FROM mysql.user; - 必须显式指定
BY 'xxx',即使密码不变——MySQL 8.0 不允许只改插件不提供密码(哪怕用原密码) - 执行后记得
FLUSH PRIVILEGES;,否则部分客户端可能仍缓存旧认证信息
新建用户时强制指定 mysql_native_password
避免后续踩坑,建用户就定死插件:
CREATE USER 'newuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'p@ssw0rd';
对比旧写法:CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'p@ssw0rd'; —— 这在 8.0 下会走默认插件,不是你想要的。
如果还要赋权,照常用 GRANT ... ON ... TO 'newuser'@'localhost';,插件类型不影响权限逻辑。
全局降级?不建议,但知道怎么关
有人想“一劳永逸”改回全局默认,MySQL 提供了 default_authentication_plugin 配置项,但:
- 仅对新创建的用户生效,已有用户不受影响
- 需要改
my.cnf(Linux)或my.ini(Windows),加一行:default_authentication_plugin=mysql_native_password - 改完必须重启 MySQL 服务,且该设置会削弱整体安全性
- 很多云数据库(如阿里云 RDS、AWS RDS)根本不允许修改这个参数
真正要兼容旧客户端,优先改用户插件,而不是动全局配置。
最易忽略的是 host 匹配和 FLUSH PRIVILEGES —— 改完连不上,先确认 User 和 Host 完全一致,再刷权限,别急着重启服务。



















