Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

15.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' 都表示明文(未加密)密码。

Note

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

ALTER USER user IDENTIFIED BY 'auth_string';
Note

随机密码生成、密码验证和辅助密码子句仅适用于使用内部存储凭证的身份验证插件的账户。对于使用外部凭证系统的身份验证插件,密码管理必须在外部系统中处理。有关内部凭证存储的更多信息,请参阅 第 8.2.15 节,“密码管理”

REPLACE 'current_auth_string' 子句执行密码验证。如果给定:

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

  • 该子句必须给定,如果账户密码更改需要指定当前密码,以验证用户是否真正知道当前密码。

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

  • 如果该子句给定但不匹配当前密码,即使该子句是可选的,语句将失败。

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

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

RETAIN CURRENT PASSWORD 子句实现双密码功能。如果给定:

  • RETAIN CURRENT PASSWORD 保留账户当前密码作为辅助密码,替换任何现有的辅助密码。新的密码变为主密码,但客户端可以使用账户连接到服务器,使用主密码或辅助密码。(例外:如果新密码为空,辅助密码也将为空,即使给定 RETAIN CURRENT PASSWORD。)

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

  • 如果账户具有辅助密码,并且您更改其主密码而不指定 RETAIN CURRENT PASSWORD,辅助密码将保持不变。

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

SET PASSWORD 允许以下 auth_option 语法:

  • = 'auth_string'

    将账户分配给定的明文密码。

  • TO RANDOM

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

    有关随机生成密码的结果集和特征的详细信息,请参阅 随机密码生成

Important

在某些情况下,SET PASSWORD 可能会被记录在服务器日志或客户端的历史文件中,例如 ~/.mysql_history,这意味着明文密码可能会被拥有读取权限的人读取。有关服务器日志中这种情况的条件和控制方法,请参阅 第 8.1.2.3 节,“密码和日志记录”。关于客户端日志记录的类似信息,请参阅 第 6.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();

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

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

账户名称的主机名部分,如果省略,默认为 '%'

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

设置命名账户的密码(带有 FOR 子句)需要 mysql 系统模式的 UPDATE 权限。设置自己的密码(对于非匿名账户,无 FOR 子句)不需要特殊权限。

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

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

有关设置密码和身份验证插件的更多信息,请参阅 第 8.2.14 节,“分配账户密码”第 8.2.17 节,“可插拔身份验证”