Documentation Home

13.7.1.10 设置密码语句

SET PASSWORD [FOR user] auth_option
    [REPLACE 'current_auth_string']
    [RETAIN CURRENT PASSWORD]

auth_option: {
    = 'auth_string'
  | TO RANDOM
}

SET PASSWORD语句为 MySQL 用户帐户分配密码。密码可以在语句中明确指定,也可以由 MySQL 随机生成。该语句还可以包括一个密码验证子句,该子句指定要替换的帐户当前密码,以及一个管理帐户是否具有辅助密码的子句。 每个代表一个明文(未加密)密码 。 'auth_string''current_auth_string'

笔记

而不是使用SET PASSWORD 分配密码,ALTER USER 是帐户更改的首选语句,包括分配密码。例如:

ALTER USER user IDENTIFIED BY 'auth_string';
笔记

随机密码生成、密码验证和辅助密码的条款仅适用于使用在 MySQL 内部存储凭据的身份验证插件的帐户。对于使用针对 MySQL 外部的凭证系统执行身份验证的插件的帐户,密码管理也必须针对该系统在外部进行处理。有关内部凭证存储的更多信息,请参阅 第 6.2.15 节,“密码管理”

该 子句执行密码验证,从 MySQL 8.0.13 开始可用。如果给出: REPLACE 'current_auth_string'

  • REPLACE指定要替换的帐户当前密码,作为明文(未加密)字符串。

  • 如果需要更改帐户的密码以指定当前密码,则必须给出该子句,以验证尝试进行更改的用户实际上知道当前密码。

  • 如果帐户的密码更改可能但不需要指定当前密码,则该子句是可选的。

  • 如果给出了子句但与当前密码不匹配,即使该子句是可选的,该语句也会失败。

  • REPLACE只有在更改当前用户的帐户密码时才能指定。

有关通过指定当前密码进行密码验证的更多信息,请参阅第 6.2.15 节,“密码管理”

RETAIN CURRENT PASSWORD子句实现双密码功能,从 MySQL 8.0.14 开始可用。如果给出:

  • RETAIN CURRENT PASSWORD保留帐户当前密码作为其辅助密码,替换任何现有的辅助密码。新密码成为主密码,但客户端可以使用该帐户使用主密码或辅助密码连接到服务器。(例外:如果语句指定的新密码SET PASSWORD 为空,则即使RETAIN CURRENT PASSWORD给出二级密码也为空。)

  • 如果您RETAIN CURRENT PASSWORD 为主密码为空的帐户指定,该语句将失败。

  • 如果一个帐户有一个二级密码,而您在没有指定的情况下更改了它的主密码RETAIN CURRENT PASSWORD,则二级密码将保持不变。

有关使用双重密码的更多信息,请参阅 第 6.2.15 节,“密码管理”

SET PASSWORD允许这些 auth_option语法:

  • = 'auth_string'

    为帐户分配给定的文字密码。

  • TO RANDOM

    为该帐户分配由 MySQL 随机生成的密码。该语句还在结果集中返回明文密码,以供执行该语句的用户或应用程序使用。

    随机生成密码的结果集和特征详见 随机密码生成

    从 MySQL 8.0.18 开始可以随机生成密码。

重要的

在某些情况下,SET PASSWORD可能会记录在服务器日志中或在客户端的历史文件中,例如 ~/.mysql_history,这意味着任何对该信息具有读取权限的人都可以读取明文密码。有关服务器日志发生这种情况的条件以及如何控制它的信息,请参阅第 6.1.2.3 节,“密码和日志记录”。有关客户端日志记录的类似信息,请参阅 第 4.5.1.3 节,“mysql 客户端日志记录”

SET PASSWORD可以使用或不使用FOR明确命名用户帐户的子句:

  • 使用子句,该语句设置指定帐户的密码,该帐户必须存在: FOR user

    SET PASSWORD FOR 'jeffrey'@'localhost' = 'auth_string';
  • 在没有子句的情况下,该语句为当前用户设置密码: FOR user

    SET PASSWORD = 'auth_string';

    任何使用非匿名帐户连接到服务器的客户端都可以更改该帐户的密码。(特别是,您可以更改自己的密码。)要查看服务器将您验证为哪个帐户,请调用该 CURRENT_USER()函数:

    SELECT CURRENT_USER();

如果 给出了子句,则帐户名使用 第 6.2.4 节“指定帐户名”中描述的格式。例如: FOR user

SET PASSWORD FOR 'bob'@'%.example.org' = 'auth_string';

帐户名的主机名部分(如果省略)默认为 '%'.

SET PASSWORD将字符串解释为明文字符串,将其传递给与帐户关联的身份验证插件,并将插件返回的结果存储在 mysql.user系统表的帐户行中。(插件有机会将值散列为它期望的加密格式。插件可以使用指定的值,在这种情况下不会发生散列。)

为命名帐户设置密码(使用 FOR子句)需要 系统模式的UPDATE权限 。mysql为自己设置密码(对于没有 FOR条款的非匿名帐户)不需要特殊权限。

修改辅助密码的语句需要这些权限:

read_only启用系统变量 时,除了任何其他所需 SET PASSWORD 的权限外,还需要CONNECTION_ADMIN 权限(或已弃用的 权限)。SUPER

有关设置密码和身份验证插件的其他信息,请参阅 第 6.2.14 节,“分配帐户密码”第 6.2.17 节,“可插入身份验证”