Documentation Home

13.7.1.7 设置密码语句

SET PASSWORD [FOR user] = password_option

password_option: {
    PASSWORD('auth_string')
  | OLD_PASSWORD('auth_string')
  | 'hash_string'
}

SET PASSWORD语句将密码分配给 MySQL 用户帐户,指定为明文(未加密)或加密值:

  • 'auth_string' 表示明文密码。

  • 'hash_string' 表示加密的密码。

重要的

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

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

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

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

    SET PASSWORD = password_option;

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

    SELECT CURRENT_USER();

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

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

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

为命名帐户设置密码(使用 FOR子句)需要 系统数据库的UPDATE权限 。mysql为自己设置密码(对于没有 FOR条款的非匿名帐户)不需要特殊权限。read_only启用系统变量后,除了需要任何其他所需权限外,还SET PASSWORD 需要该SUPER权限。

可以通过以下方式指定密码:

  • 使用PASSWORD()函数

    PASSWORD()参数是明文(未加密)密码 。PASSWORD()对密码进行哈希处理,返回加密后的密码字符串,存放在 mysql.user系统表的账户行中。

    该函数使用由系统变量值PASSWORD()的值确定的哈希方法对密码进行哈希处理 。old_passwords如果因格式不正确而SET PASSWORD拒绝返回的散列密码值PASSWORD(),则可能需要更改 old_passwords以更改散列方法。例如,如果帐户使用 mysql_native_password插件,则该 old_passwords值必须为 0:

    SET old_passwords = 0;
    SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('password');

    如果该old_passwords值与身份验证插件所需的值不同,则返回的散列密码值 PASSWORD()对于该插件是不可接受的,并且尝试设置密码会产生错误。例如:

    mysql> SET old_passwords = 1;
    mysql> SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('password');
    ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number

    允许old_passwords 的值将在本节后面描述。

  • 使用OLD_PASSWORD() 函数:

    函数参数是明文(未加密)密码 。 使用 pre-4.1 散列法对密码进行散列处理,并返回加密后的密码字符串,以存储在 系统表的帐户行中。此哈希方法仅适用于使用 身份验证插件的帐户。 'auth_string'OLD_PASSWORD()mysql.usermysql_old_password

  • 使用已经加密的密码字符串

    密码被指定为字符串文字。它必须代表已加密的密码值,采用帐户使用的身份验证方法所需的哈希格式。

下表显示了每种密码哈希方法的允许值old_passwords以及哪些身份验证插件使用该哈希方法。

密码散列法 old_passwords 值 关联的身份验证插件
MySQL 4.1 本机散列 0 mysql_native_password
Pre-4.1()散列 1个 mysql_old_password
SHA-256 哈希 2个 sha256_password
警告

如果您使用 4.1 之前的客户端程序连接到 MySQL 4.1 或更高版本的服务器,请不要在未先阅读第 6.1.2.4 节,“MySQL 中的密码散列”之前更改您的密码。默认密码散列格式在 MySQL 4.1 中发生了变化,如果您更改密码,它可能会使用 4.1 之前的客户端无法生成的散列格式存储,从而阻止您之后连接到服务器。

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