mysql 8.0中设置密码最小长度的系统变量是validate_password.length,它是在validate_password插件启用后生效的全局变量,直接强制限制最短密码字符数,低于该值的密码会被拒绝。

MySQL 8.0中设置密码最小长度的系统变量是哪个
MySQL 8.0 默认启用 validate_password 插件,控制密码强度的核心变量是 validate_password.length。它直接定义允许的最短密码字符数,不是“建议值”,而是硬性门槛——低于该值的密码会直接被拒绝。
注意:这个变量只有在插件已加载的前提下才生效。如果执行 SHOW VARIABLES LIKE 'validate_password%'; 返回空结果,说明插件没启用,后续设置全无效。
启用插件并设置最小长度的完整操作步骤
必须按顺序执行,跳过任一环节都会导致设置不生效:
- 用具有
SUPER权限的账户(如root)连接 MySQL - 运行
INSTALL PLUGIN validate_password SONAME 'validate_password.so';(Linux)或'validate_password.dll'(Windows) - 确认加载成功:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';,状态必须为ACTIVE - 设置最小长度:
SET GLOBAL validate_password.length = 12;(例如要求至少 12 位) - (可选但推荐)写入配置文件持久化:
validate_password.length = 12加到my.cnf的[mysqld]段下,避免重启失效
为什么 SET SESSION 不起作用、且新用户仍能设短密码
validate_password.* 系列变量全部是全局级(GLOBAL-only),SET SESSION validate_password.length = 8; 会报错 Variable 'validate_password.length' is a GLOBAL variable and should be set with SET GLOBAL。
更关键的是:变量生效有延迟窗口。刚设置完 GLOBAL 值后立即创建用户,可能因权限缓存未刷新而绕过校验。务必在设置后执行 FLUSH PRIVILEGES;,并用全新连接测试(比如新开一个 mysql 客户端)。
另一个常见疏漏:如果已有用户通过旧弱密码登录,ALTER USER ... IDENTIFIED BY 修改密码时仍受新规则约束;但直接 SET PASSWORD 或使用旧版客户端(如 MySQL 5.7 客户端连 8.0 服务端)可能触发兼容性降级,跳过校验——确保客户端和服务端协议版本匹配。
与其他 validate_password 变量的协同影响
validate_password.length 不是孤立起作用的。例如:
- 当
validate_password.mixed_case_count = 1且validate_password.number_count = 1同时启用时,12 位长度 ≠ 允许 12 个纯小写字母;实际需至少包含 1 个大写、1 个数字,剩余 10 位才自由 -
validate_password.policy设为MEDIUM或更高时,length的最低允许值会被强制提升(LOW策略下最小可设为 4,MEDIUM要求至少 8) - 若同时启用了
validate_password.dictionary_file,即使满足长度和字符类型,含字典词的密码也会被拒——这时单纯加长密码没用,得换组合
真正起效的密码策略,是这一组变量共同裁决的结果,不能只盯住 length 单点调整。











