13.7.1.7 SET PASSWORD 语句

SET PASSWORD [FOR user] = password_option

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

SET PASSWORD语句为 MySQL 用户帐户分配密码。 'auth_string'代 table 明文(未加密)密码。

Note

ALTER USER user IDENTIFIED BY 'auth_string';

Important

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

SET PASSWORD可以与是否有明确命名用户帐户的FOR子句一起使用:

  • 该语句使用FOR user子句设置命名帐户的密码,该密码必须存在:
SET PASSWORD FOR 'jeffrey'@'localhost' = 'auth_string';
  • 没有FOR user子句,该语句设置当前用户的密码:
SET PASSWORD = 'auth_string';

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

SELECT CURRENT_USER();

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

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

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

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

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

SET PASSWORD FOR 'jeffrey'@'localhost' = 'password';

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

  • 使用PASSWORD()函数(自 MySQL 5.7.6 起不推荐使用)
SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('password');

PASSWORD()参数是明文(未加密)密码。 PASSWORD()散列密码并返回加密的密码字符串,以存储在mysql.user系统 table 的帐户行中。

PASSWORD()函数使用由old_passwords系统变量值的值确定的哈希方法对密码进行哈希处理。确保old_passwords具有与该帐户关联的身份验证插件所期望的哈希方法相对应的值。例如,如果帐户使用mysql_native_password插件,则old_passwords值必须为 0:

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

如果old_passwords的值与身份验证插件所需的值不同,则PASSWORD()返回的哈希密码值将不能被插件使用,并且不会进行 Client 端连接的正确身份验证。

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

密码哈希方法old_passwords Value关联身份验证插件
MySQL 4.1 本机哈希0mysql_native_password
SHA-256 hashing2sha256_password

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