MySQL 5.7 中 password 字段被移除,改用 TEXT 类型的 authentication_string 字段统一存储插件相关凭证;必须用 PASSWORD() 函数或 ALTER USER 命令更新并自动刷新权限,否则手动赋值或遗漏 FLUSH PRIVILEGES 将导致登录失败。

MySQL 5.7 中 password 字段被移除,直接原因是认证机制重构 —— 它不再依赖明文哈希存储,而是统一由插件(如 mysql_native_password)管理凭证,authentication_string 是新设计的通用凭证容器字段。
authentication_string 是什么类型字段?
它是一个 TEXT 类型字段,不是 VARCHAR,也不再只存传统 PASSWORD() 哈希值。实际内容取决于认证插件:对 mysql_native_password 是 SHA1 哈希;对 caching_sha2_password(8.0 默认)则是 SHA256 + salt 的编码串。5.7 默认仍用前者,但字段结构已为插件扩展预留空间。
直接 UPDATE authentication_string 会出什么问题?
-
UPDATE mysql.user SET authentication_string = 'xxx' WHERE user = 'root'—— 错误!手动填裸字符串不会被识别,登录必然失败 - 必须用
PASSWORD('newpass')函数(5.7 支持但已标记为 deprecated),或更稳妥地用ALTER USER - 如果跳过
FLUSH PRIVILEGES,修改不生效 —— 这是常见漏点
为什么 ALTER USER 比 UPDATE 更推荐?
因为 ALTER USER 会自动调用对应认证插件的加密逻辑,并刷新内存权限缓存,避免手写 SQL 时遗漏步骤:
安全的随机密码生成器。支持自定义长度、字符类型(大写/小写字母、数字、特殊符号),排除相似字符,批量生成。纯 Python 标准库,无需 API 密钥。
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass123!';
注意三点:
- 密码必须满足默认策略(至少 8 位、含大小写字母+数字+特殊字符),否则报错
Your password does not satisfy the current policy requirements - 主机名要精确匹配,
'root'@'localhost'和'root'@'%'是两个不同账户 - 执行后无需手动
FLUSH PRIVILEGES,但旧连接仍用旧凭据,新连接才生效
最易被忽略的是:改完密码后忘记删掉 skip-grant-tables 或没重启服务,导致数据库长期处于无认证状态 —— 这不是功能问题,是安全盲区。


















