mysql 8.0 因认证插件变更、password()函数移除、alter user语法强制要求identified by、默认插件改为caching_sha2_password及密码策略变量名更新,导致5.7命令直接复用失败。

ALTER USER 语法差异和认证插件变更导致直接复用 5.7 命令在 8.0 中失败,不是“命令写错了”,而是底层机制已不兼容。
MySQL 8.0 已废弃 password() 函数
你在 5.7 里习惯写的 SET PASSWORD = PASSWORD('xxx') 或 UPDATE mysql.user SET authentication_string = PASSWORD('xxx'),在 8.0 中会报错 ERROR 1305 (42000): FUNCTION xxx.PASSWORD does not exist。
-
PASSWORD()函数从 8.0.11 起被彻底移除,不再提供哈希能力 - 8.0 使用更安全的哈希方式(如
caching_sha2_password),且必须由服务端内部生成,不允许用户手动拼接字符串 - 即使你绕过函数、直接写哈希值进
authentication_string字段,也会因插件不匹配而登录失败
ALTER USER 的语法必须带 IDENTIFIED BY(不能省略)
5.7 中允许 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password 不设密码,但 8.0 要求:只要改用户,就必须明确指定认证方式与密码(或显式设为空)。
- 错误写法:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password→ 报错ERROR 1827 (HY000): The password cannot be null - 正确写法:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpass123' - 若想设空密码(仅限测试环境):
ALTER USER 'root'@'localhost' IDENTIFIED BY ''
默认认证插件不一致,mysql_native_password 需显式声明
5.7 默认用 mysql_native_password,8.0 默认是 caching_sha2_password。如果你用老客户端(如旧版 Navicat、Python 2 的 MySQLdb)连 8.0,即使密码正确,也会卡在握手阶段,报错类似 Authentication plugin 'caching_sha2_password' cannot be loaded。
- 检查当前插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root'; - 临时兼容老客户端:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpass123'; - 全局改默认插件(需重启):
default_authentication_plugin=mysql_native_password加到[mysqld]段下
密码策略变量名全部变更,validate_password 配置失效
5.7 的 validate_password_policy、validate_password_length 等变量,在 8.0 中已被替换为 validate_password.policy、validate_password.length(带英文点号),且行为更严格。
- 5.7 写法:
SET GLOBAL validate_password_policy = 0;→ 在 8.0 中报错ERROR 1193 (HY000): Unknown system variable 'validate_password_policy' - 8.0 正确写法:
SET GLOBAL validate_password.policy = LOW;或SET GLOBAL validate_password.length = 6; - 注意:8.0 还新增了
validate_password.check_user_name(禁止密码含用户名),默认开启











