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.user
mysql_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 节,“可插入身份验证”。