#### 13.7.1.10 SET PASSWORD 语句

[](<>)[](<>)[](<>)

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

auth_option: {
    = 'auth_string'
  | TO RANDOM
}
```

这[`设置密码`](set-password.html)语句为 MySQL 用户帐户分配密码。密码可以在语句中明确指定，也可以由 MySQL 随机生成。该语句还可以包括指定要替换的帐户当前密码的密码验证子句，以及管理帐户是否具有辅助密码的子句。`'*`auth_string`*'`和`'*`current_auth_string`*'`每个代表一个明文（未加密）密码。

笔记

而不是使用[`设置密码`](set-password.html)分配密码，[`更改用户`](alter-user.html)是帐户更改的首选语句，包括分配密码。例如：

```
ALTER USER user IDENTIFIED BY 'auth_string';
```

笔记

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

这`代替 '*`current_auth_string`*'`子句执行密码验证，从 MySQL 8.0.13 开始可用。如果给出：

-   `代替`指定要替换的帐户当前密码，作为明文（未加密）字符串。

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

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

-   如果给出了该子句但与当前密码不匹配，则该语句将失败，即使该子句是可选的。

-   `代替`只有在更改当前用户的帐户密码时才能指定。

    有关通过指定当前密码进行密码验证的详细信息，请参阅[第 6.2.15 节，“密码管理”](password-management.html).

    这`保留当前密码`子句实现双密码功能，从 MySQL 8.0.14 开始可用。如果给出：

-   `保留当前密码`保留帐户当前密码作为其二级密码，替换任何现有的二级密码。新密码成为主密码，但客户端可以使用该帐户使用主密码或辅助密码连接到服务器。（例外：如果新密码由[`设置密码`](set-password.html)语句为空，二级密码也为空，即使`保留当前密码`给出。）

-   如果您指定`保留当前密码`对于主密码为空的帐户，该语句将失败。

-   如果帐户有二级密码，而您更改其主密码但未指定`保留当前密码`，二级密码保持不变。

    有关使用双重密码的更多信息，请参阅[第 6.2.15 节，“密码管理”](password-management.html).

[`设置密码`](set-password.html)允许这些*`auth_option`*语法：

-   `='*`auth_string`*'`

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

-   `随机`

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

    随机生成密码的结果集和特征，请参见[随机密码生成](password-management.html#random-password-generation).

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

重要的

在某些情况下，[`设置密码`](set-password.html)可以记录在服务器日志中，也可以记录在客户端的历史文件中，例如`~/.mysql_history`，这意味着任何有权读取该信息的人都可以读取明文密码。有关服务器日志发生这种情况的条件以及如何控制它的信息，请参阅[第 6.1.2.3 节，“密码和日志记录”](password-logging.html).有关客户端日志记录的类似信息，请参阅[第 4.5.1.3 节，“mysql 客户端日志记录”](mysql-logging.html).

[`设置密码`](set-password.html)可以使用或不使用`为了`显式命名用户帐户的子句：

-   带一个`为了 *`用户`*`子句，该语句设置命名帐户的密码，该密码必须存在：

    ```
    SET PASSWORD FOR 'jeffrey'@'localhost' = 'auth_string';
    ```

-   没有`为了 *`使用者`*`子句中，该语句为当前用户设置密码：

    ```
    SET PASSWORD = 'auth_string';
    ```

    任何使用非匿名帐户连接到服务器的客户端都可以更改该帐户的密码。（尤其是，您可以更改自己的密码。）要查看服务器将您验证为哪个帐户，请调用[`当前用户（）`](information-functions.html#function_current-user)功能：

    ```
    SELECT CURRENT_USER();
    ```

    如果`因为*`使用者`*`子句，则帐户名使用中描述的格式[第6.2.4节“指定账户名称”](account-names.html).例如：


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

帐户名的主机名部分（如果省略）默认为`'%'`.

[`设置密码`](set-password.html)将字符串解释为明文字符串，将其传递给与帐户关联的身份验证插件，并将插件返回的结果存储在`mysql。使用者`系统表。（插件有机会将值散列到它期望的加密格式中。插件可以使用指定的值，在这种情况下不会发生散列。）

设置命名帐户的密码（使用`对于`条款）要求[`使现代化`](privileges-provided.html#priv_update)特权`mysql`系统模式。为自己设置密码（对于没有密码的非匿名帐户）`对于`条款）不需要特殊特权。

修改辅助密码的语句需要以下权限：

-   这个[`应用程序\密码\管理员`](privileges-provided.html#priv_application-password-admin)使用`保留当前密码`条款[`设置密码`](set-password.html)适用于您自己账户的对账单。由于大多数用户只需要一个密码，因此需要该权限来操作自己的辅助密码。

-   如果允许一个帐户操作所有帐户的辅助密码，则应授予该帐户[`创建用户`](privileges-provided.html#priv_create-user)特权而不是[`应用程序\密码\管理员`](privileges-provided.html#priv_application-password-admin).

    当[`只读`](server-system-variables.html#sysvar_read_only)系统变量已启用，[`设置密码`](set-password.html)需要[`连接管理`](privileges-provided.html#priv_connection-admin)特权（或不推荐的[`超级的`](privileges-provided.html#priv_super)特权），以及任何其他必需的特权。

    有关设置密码和身份验证插件的更多信息，请参阅[第6.2.14节，“分配帐户密码”](assigning-passwords.html)和[第6.2.17节，“可插拔认证”](pluggable-authentication.html).
