MySQL 8.0+ 必须用 ALTER USER 修改密码,SET PASSWORD 仅支持当前用户且不可带 PASSWORD() 函数;PASSWORD() 函数已被彻底移除,执行含该函数的语句会报 ERROR 1064;ALTER USER 同时更新密码与过期状态,自动生效无需 FLUSH PRIVILEGES。

MySQL 8.0+ 不再支持 PASSWORD() 函数
直接写 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456'); 会报 ERROR 1064 (42000),因为 MySQL 8.0 彻底移除了 PASSWORD() 这个内置函数。它不是拼写错误或空格问题,而是语法层面已被废弃。
-
PASSWORD()在 5.7 中已标记为 deprecated,8.0 起完全不可用 - 即使你用的是 5.7,某些严格 SQL 模式下也可能拒绝该函数调用
- 替代方案不是“换写法”,而是必须改用
ALTER USER
SET PASSWORD 语句本身在 8.0+ 仍有保留,但语法受限
MySQL 8.0 仍接受 SET PASSWORD,但只允许赋值纯字符串(不带函数),且仅对当前用户生效(不能指定 FOR 'user'@'host'):
- ✅ 正确(当前用户):
SET PASSWORD = 'newpass123'; - ❌ 错误(指定用户):
SET PASSWORD FOR 'root'@'localhost' = 'newpass123';→ 报错 1064 - ❌ 错误(带函数):
SET PASSWORD = PASSWORD('x');→ 报错 1064 或 1372(函数不存在)
真正推荐的修改方式是 ALTER USER
这是 MySQL 5.7.6+ 官方唯一推荐、全版本兼容、权限语义清晰的密码修改方式:
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 基础用法:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass123'; - 若连接报错
ERROR 2058(caching_sha2_password 认证失败),加插件声明:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpass123'; - 修改后无需
FLUSH PRIVILEGES;——ALTER USER自动持久化并生效
容易忽略的坑:密码策略拦截也会伪装成语法错误
当你执行 ALTER USER ... IDENTIFIED BY '123' 却收到 ERROR 1819 (HY000),这不是语法问题,而是 validate_password 插件在拦截弱密码。它可能让你误以为 SQL 写错了,实际是策略不满足:
- 检查策略:
SHOW VARIABLES LIKE 'validate_password%'; - MySQL 8.0 的变量名带点,如
validate_password.policy,不是validate_password_policy - 临时放宽(仅测试环境):
SET GLOBAL validate_password.policy = LOW;或= 0;,但注意 8.0 中validate_password_length已改为validate_password.length
密码过期、认证插件切换、策略拦截这三类问题,都会在你敲完命令回车后立刻报错,表面像语法错误,实则和 SQL 解析无关。先看错误码:1064 是真语法错,1819/2058/1862 都得绕开语法去查服务端状态。










