#### 13.7.1.3 创建用户声明

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

```
CREATE USER [IF NOT EXISTS]
    user [auth_option] [, user [auth_option]] ...
    DEFAULT ROLE role [, role ] ...
    [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
    [WITH resource_option [resource_option] ...]
    [password_option | lock_option] ...
    [COMMENT 'comment_string' | ATTRIBUTE 'json_object']

user:
    (see Section 6.2.4, “Specifying Account Names”)

auth_option: {
    IDENTIFIED BY 'auth_string' [AND 2fa_auth_option]
  | IDENTIFIED BY RANDOM PASSWORD [AND 2fa_auth_option]
  | IDENTIFIED WITH auth_plugin [AND 2fa_auth_option]
  | IDENTIFIED WITH auth_plugin BY 'auth_string' [AND 2fa_auth_option]
  | IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD [AND 2fa_auth_option]
  | IDENTIFIED WITH auth_plugin AS 'auth_string' [AND 2fa_auth_option]
  | IDENTIFIED WITH auth_plugin [initial_auth_option]
}

2fa_auth_option: {
    IDENTIFIED BY 'auth_string' [AND 3fa_auth_option]
  | IDENTIFIED BY RANDOM PASSWORD [AND 3fa_auth_option]
  | IDENTIFIED WITH auth_plugin [AND 3fa_auth_option]
  | IDENTIFIED WITH auth_plugin BY 'auth_string' [AND 3fa_auth_option]
  | IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD [AND 3fa_auth_option]
  | IDENTIFIED WITH auth_plugin AS 'auth_string' [AND 3fa_auth_option]
}

3fa_auth_option: {
    IDENTIFIED BY 'auth_string'
  | IDENTIFIED BY RANDOM PASSWORD
  | IDENTIFIED WITH auth_plugin
  | IDENTIFIED WITH auth_plugin BY 'auth_string'
  | IDENTIFIED WITH auth_plugin BY RANDOM PASSWORD
  | IDENTIFIED WITH auth_plugin AS 'auth_string'
}

initial_auth_option: {
    INITIAL AUTHENTICATION IDENTIFIED BY {RANDOM PASSWORD | 'auth_string'}
  | INITIAL AUTHENTICATION IDENTIFIED WITH auth_plugin AS 'auth_string'
}

tls_option: {
   SSL
 | X509
 | CIPHER 'cipher'
 | ISSUER 'issuer'
 | SUBJECT 'subject'
}

resource_option: {
    MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count
}

password_option: {
    PASSWORD EXPIRE [DEFAULT | NEVER | INTERVAL N DAY]
  | PASSWORD HISTORY {DEFAULT | N}
  | PASSWORD REUSE INTERVAL {DEFAULT | N DAY}
  | PASSWORD REQUIRE CURRENT [DEFAULT | OPTIONAL]
  | FAILED_LOGIN_ATTEMPTS N
  | PASSWORD_LOCK_TIME {N | UNBOUNDED}
}

lock_option: {
    ACCOUNT LOCK
  | ACCOUNT UNLOCK
}
```

这[`创建用户`](create-user.html)语句创建新的 MySQL 帐户。它支持为新帐户建立身份验证、角色、SSL/TLS、资源限制、密码管理、注释和属性属性。它还控制帐户最初是锁定还是解锁。

使用[`创建用户`](create-user.html), 你必须有全局[`创建用户`](privileges-provided.html#priv_create-user)特权，或[`插入`](privileges-provided.html#priv_insert)的特权`mysql`系统架构。当。。。的时候[`只读`](server-system-variables.html#sysvar_read_only)系统变量已启用，[`创建用户`](create-user.html)另外需要[`CONNECTION_ADMIN`](privileges-provided.html#priv_connection-admin)特权（或已弃用的[`极好的`](privileges-provided.html#priv_super)特权）。

从 MySQL 8.0.27 开始，这些额外的特权注意事项适用：

-   这[`身份验证策略`](server-system-variables.html#sysvar_authentication_policy)系统变量对认证相关子句的方式设置了一定的限制。[`创建用户`](create-user.html)可以使用语句；有关详细信息，请参阅该变量的说明。如果您有[`AUTHENTICATION_POLICY_ADMIN`](privileges-provided.html#priv_authentication-policy-admin)特权。

-   要创建使用无密码身份验证的帐户，您必须拥有[`PASSWORDLESS_USER_ADMIN`](privileges-provided.html#priv_passwordless-user-admin)特权。

    从 MySQL 8.0.22 开始，[`创建用户`](create-user.html)如果要创建的任何帐户被命名为`定义者`任何存储对象的属性。（也就是说，如果创建帐户会导致该帐户采用当前孤立的存储对象，则该语句将失败。）无论如何要执行该操作，您必须拥有[`SET_USER_ID`](privileges-provided.html#priv_set-user-id)特权;在这种情况下，该语句成功并显示警告而不是失败并显示错误。没有[`SET_USER_ID`](privileges-provided.html#priv_set-user-id)，要执行用户创建操作，删除孤立对象，创建帐户并授予其权限，然后重新创建删除的对象。有关其他信息，包括如何识别哪些对象将给定帐户命名为`定义者`属性，见[孤立存储对象](stored-objects-security.html#stored-objects-security-orphan-objects).

[`创建用户`](create-user.html)要么对所有命名用户成功，要么回滚，如果发生任何错误则无效。默认情况下，如果您尝试创建已存在的用户，则会发生错误。如果`如果不存在`给定子句时，该语句会为每个已存在的命名用户生成警告，而不是错误。

重要的

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

有几个方面的[`创建用户`](create-user.html)声明，在以下主题下进行描述：

-   [创建用户概述](create-user.html#create-user-overview)

-   [创建用户身份验证选项](create-user.html#create-user-authentication)

-   [创建用户多因素身份验证选项](create-user.html#create-user-multifactor-authentication)

-   [创建用户角色选项](create-user.html#create-user-role)

-   [创建用户 SSL/TLS 选项](create-user.html#create-user-tls)

-   [CREATE USER 资源限制选项](create-user.html#create-user-resource-limits)

-   [创建用户密码管理选项](create-user.html#create-user-password-management)

-   [CREATE USER 注释和属性选项](create-user.html#create-user-comments-attributes)

-   [创建用户帐户锁定选项](create-user.html#create-user-account-locking)

-   [CREATE USER 二进制日志](create-user.html#create-user-binary-logging)

##### 创建用户概述

对于每个帐户，[`创建用户`](create-user.html)在`mysql.user`系统表。科目行反映了报表中指定的属性。未指定的属性设置为其默认值：

-   Authentication：默认的身份验证插件（如中所述确定）[默认身份验证插件](pluggable-authentication.html#pluggable-authentication-default-plugin)) 和空凭据

-   默认角色：`没有`

-   SSL/TLS：`没有`

-   资源限制：无限制

-   密码管理：`密码过期 默认密码历史 默认密码重用间隔 默认密码 需要当前默认密码`;登录失败跟踪和临时帐户锁定被禁用

-   账户锁定：`帐户解锁`

    首次创建的帐户没有权限，默认角色为`没有`.要分配权限或角色，请使用[`授予`](grant.html)陈述。

    每个帐户名称都使用中描述的格式[第 6.2.4 节，“指定帐户名称”](account-names.html).例如：


```
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
```

账户名的主机名部分，如果省略，默认为`'%'`.

每个*`用户`*命名帐户的值后面可以跟一个可选的*`auth_option`*指示帐户如何进行身份验证的值。这些值允许指定帐户身份验证插件和凭据（例如，密码）。每个*`auth_option`*价值适用*只要*到它之前命名的帐户。

继*`用户`*规范中，该语句可能包括 SSL/TLS、资源限制、密码管理和锁定属性的选项。所有这些选项都是*全球的*声明并适用于*全部*声明中指定的账户。

示例：创建一个使用默认身份验证插件和给定密码的帐户。将密码标记为过期，以便用户在第一次连接到服务器时必须选择一个新密码：

```
CREATE USER 'jeffrey'@'localhost'
  IDENTIFIED BY 'new_password' PASSWORD EXPIRE;
```

示例：创建一个使用`cache_sha2_password`身份验证插件和给定的密码。要求每 180 天选择一个新密码，并启用登录失败跟踪，以便连续三个错误密码导致帐户临时锁定两天：

```
CREATE USER 'jeffrey'@'localhost'
  IDENTIFIED WITH caching_sha2_password BY 'new_password'
  PASSWORD EXPIRE INTERVAL 180 DAY
  FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LOCK_TIME 2;
```

示例：创建多个帐户，指定一些每个帐户的属性和一些全局属性：

```
CREATE USER
  'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password
                                   BY 'new_password1',
  'jeanne'@'localhost' IDENTIFIED WITH caching_sha2_password
                                  BY 'new_password2'
  REQUIRE X509 WITH MAX_QUERIES_PER_HOUR 60
  PASSWORD HISTORY 5
  ACCOUNT LOCK;
```

每个*`auth_option`*价值 （`由...识别`在这种情况下）仅适用于紧接在其前面的帐户，因此每个帐户都使用紧随其后的身份验证插件和密码。

其余属性全局应用于语句中命名的所有帐户，因此对于两个帐户：

-   必须使用有效的 X.509 证书进行连接。

-   每小时最多允许 60 个查询。

-   密码更改不能重复使用五个最近的密码中的任何一个。

-   该帐户最初被锁定，因此它实际上是一个占位符，并且在管理员解锁之前无法使用。

##### 创建用户身份验证选项

帐户名后面可以跟一个*`auth_option`*指定帐户身份验证插件、凭据或两者的身份验证选项。

笔记

在 MySQL 8.0.27 之前，*`auth_option`*定义帐户进行身份验证的唯一方法。也就是说，所有帐户都使用单因素/单因素身份验证 (1FA/SFA)。MySQL 8.0.27 及更高版本支持多因素身份验证 (MFA)，因此帐户最多可以有三种身份验证方法。也就是说，帐户可以使用两因素身份验证 (2FA) 或三因素身份验证 (3FA)。的语法和语义*`auth_option`*保持不变，但*`auth_option`*后面可能会附有其他认证方法的规范。本节介绍*`auth_option`*.有关可选的 MFA 相关以下子句的详细信息，请参见[创建用户多因素身份验证选项](create-user.html#create-user-multifactor-authentication).

笔记

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

-   *`auth_plugin`*命名身份验证插件。插件名称可以是带引号的字符串文字或不带引号的名称。插件名称存储在`插入`的列`mysql.user`系统表。

    为了*`auth_option`*不指定身份验证插件的语法，服务器分配默认插件，如中所述确定[默认身份验证插件](pluggable-authentication.html#pluggable-authentication-default-plugin).有关每个插件的说明，请参阅[第 6.4.1 节，“身份验证插件”](authentication-plugins.html).

-   内部存储的凭据存储在`mysql.user`系统表。一个`'*`auth_string`*'`价值或`随机密码`指定帐户凭据，可以是明文（未加密）字符串，也可以是与帐户关联的身份验证插件期望的格式散列，分别：

    -   对于使用的语法`经过 '*`auth_string`*'`，字符串是明文并被传递给身份验证插件以进行可能的散列。插件返回的结果存储在`mysql.user`桌子。插件可以使用指定的值，在这种情况下不会发生散列。

    -   对于使用的语法`通过随机密码`, MySQL 生成一个随机密码并以明文形式传递给身份验证插件以进行可能的哈希处理。插件返回的结果存储在`mysql.user`桌子。插件可以使用指定的值，在这种情况下不会发生散列。

        随机生成的密码自 MySQL 8.0.18 起可用，并具有中描述的特征[随机密码生成](password-management.html#random-password-generation).

    -   对于使用的语法`作为 '*`auth_string`*'`, 字符串假定已经是认证插件所需的格式，并按原样存储在`mysql.user`桌子。如果插件需要散列值，则该值必须已经以适合插件的格式散列；否则，插件无法使用该值，并且不会发生客户端连接的正确身份验证。

        从 MySQL 8.0.17 开始，散列字符串可以是字符串文字或十六进制值。后者对应于显示的值的类型[`显示创建用户`](show-create-user.html)对于包含不可打印字符的密码哈希，当[`print_identified_with_as_hex`](server-system-variables.html#sysvar_print_identified_with_as_hex)系统变量已启用。

    -   如果身份验证插件不执行身份验证字符串的散列，则`经过 '*`auth_string`*'`和`作为 '*`auth_string`*'`子句具有相同的效果：身份验证字符串按原样存储在`mysql.user`系统表。

[`创建用户`](create-user.html)允许这些*`auth_option`*语法：

-   `由'*标识`auth_string`*'`

    将账户认证插件设置为默认插件，通过明文`'*`auth_string`*'`值给插件以进行可能的散列，并将结果存储在帐户行中`mysql.user`系统表。

-   `由随机密码识别`

    将帐户身份验证插件设置为默认插件，生成随机密码，将明文密码值传递给插件以进行可能的哈希处理，并将结果存储在`mysql.user`系统表。该语句还在结果集中返回明文密码，以使其可供执行该语句的用户或应用程序使用。随机生成密码的结果集和特征，请参见[随机密码生成](password-management.html#random-password-generation).

-   `标识为 *`auth_plugin`*`

    将帐户身份验证插件设置为*`auth_plugin`*，将凭据清除为空字符串，并将结果存储在`mysql.user`系统表。

-   `标识为 *`auth_plugin`* 经过 '*`auth_string`*'`

    将帐户身份验证插件设置为*`auth_plugin`*，通过明文`'*`auth_string`*'`插件的值以进行可能的散列，并将结果存储在帐户行中`mysql.user`系统表。

-   `标识为 *`auth_plugin`* 随机密码`

    将帐户身份验证插件设置为*`auth_plugin`*，生成一个随机密码，将明文密码值传递给插件进行可能的哈希处理，并将结果存储在`mysql.user`系统表。该语句还在结果集中返回明文密码，以使其可供执行该语句的用户或应用程序使用。随机生成密码的结果集和特征，请参见[随机密码生成](password-management.html#random-password-generation).

-   `标识为 *`auth_plugin`* 作为 '*`auth_string`*'`

    将帐户身份验证插件设置为*`auth_plugin`*并存储`'*`auth_string`*'`价值在`mysql.user`帐户行。如果插件需要散列字符串，则假定该字符串已按照插件所需的格式进行散列。

    示例：将密码指定为明文；使用默认插件：


```
CREATE USER 'jeffrey'@'localhost'
  IDENTIFIED BY 'password';
```

示例：指定身份验证插件以及明文密码值：

```
CREATE USER 'jeffrey'@'localhost'
  IDENTIFIED WITH mysql_native_password BY 'password';
```

在每种情况下，存储在帐户行中的密码值都是明文值`'*`密码`*'`在与帐户关联的身份验证插件对其进行哈希处理之后。

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

##### 创建用户多因素身份验证选项

这*`auth_option`*部分[`创建用户`](create-user.html)为单因素/单因素身份验证 (1FA/SFA) 定义了一种身份验证方法。从 MySQL 8.0.27 开始，[`创建用户`](create-user.html)具有支持多因素身份验证 (MFA) 的子句，因此帐户最多可以具有三种身份验证方法。也就是说，帐户可以使用两因素身份验证 (2FA) 或三因素身份验证 (3FA)。

这[`身份验证策略`](server-system-variables.html#sysvar_authentication_policy)系统变量定义约束[`创建用户`](create-user.html)带有多重身份验证 (MFA) 子句的语句。例如，[`身份验证策略`](server-system-variables.html#sysvar_authentication_policy)设置控制帐户可能具有的身份验证因素的数量，以及对于每个因素，允许哪些身份验证方法。看[配置多因素身份验证策略](multifactor-authentication.html#multifactor-authentication-policy).

有关为没有插件的身份验证子句确定默认身份验证插件的特定因素规则的信息，请参阅[默认身份验证插件](pluggable-authentication.html#pluggable-authentication-default-plugin).

下列的*`auth_option`*，可能会出现不同的可选 MFA 子句：

-   *`2fa_auth_option`*：指定因子 2 身份验证方法。以下示例定义`cache_sha2_password`作为因素 1 身份验证方法，以及`authentication_ldap_sasl`作为因素 2 身份验证方法。

    ```
    CREATE USER 'u1'@'localhost'
      IDENTIFIED WITH caching_sha2_password
        BY 'sha2_password'
      AND IDENTIFIED WITH authentication_ldap_sasl
        AS 'uid=u1_ldap,ou=People,dc=example,dc=com';
    ```

-   *`3fa_auth_option`*： 下列的*`2fa_auth_option`*，可能会出现一个*`3fa_auth_option`*子句指定因子 3 身份验证方法。以下示例定义`cache_sha2_password`作为因素 1 认证方法，`authentication_ldap_sasl`作为因素 2 身份验证方法，以及`身份验证_fido`作为因素 3 身份验证方法

    ```
    CREATE USER 'u1'@'localhost'
      IDENTIFIED WITH caching_sha2_password
        BY 'sha2_password'
      AND IDENTIFIED WITH authentication_ldap_sasl
        AS 'uid=u1_ldap,ou=People,dc=example,dc=com'
      AND IDENTIFIED WITH authentication_fido;
    ```

-   *`initial_auth_option`*：指定用于配置 FIDO 无密码身份验证的初始身份验证方法。如下所示，使用生成的随机密码或用户指定的临时身份验证*`授权字符串`*需要启用 FIDO 无密码身份验证。

    ```
    CREATE USER user
      IDENTIFIED WITH authentication_fido
      INITIAL AUTHENTICATION IDENTIFIED BY {RANDOM PASSWORD | 'auth_string'};
    ```

    有关使用 FIDO 可插入身份验证配置无密码身份验证的信息，请参阅[FIDO 无密码身份验证](fido-pluggable-authentication.html#fido-pluggable-authentication-passwordless).

##### 创建用户角色选项

[](<>)

这`默认角色`子句定义当用户连接到服务器并进行身份验证或用户执行[`设置角色默认值`](set-role.html)会议期间的声明。

每个角色名称都使用中描述的格式[第 6.2.5 节，“指定角色名称”](role-names.html).例如：

```
CREATE USER 'joe'@'10.0.0.1' DEFAULT ROLE administrator, developer;
```

角色名的主机名部分，如果省略，默认为`'%'`.

这`默认角色`子句允许列出一个或多个以逗号分隔的角色名称。这些角色必须当时存在[`创建用户`](create-user.html)被执行；否则该语句会引发错误（[`ER_USER_DOES_NOT_EXIST`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_user_does_not_exist))，并且不会创建用户。

##### 创建用户 SSL/TLS 选项

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

除了基于用户名和凭据的常规身份验证之外，MySQL 还可以检查 X.509 证书属性。有关在 MySQL 中使用 SSL/TLS 的背景信息，请参阅[第 6.3 节，“使用加密连接”](encrypted-connections.html).

要为 MySQL 帐户指定 SSL/TLS 相关选项，请使用`要求`指定一个或多个的子句*`tls_option`*价值观。

顺序`要求`选项无关紧要，但没有选项可以指定两次。这`和`关键字是可选的`要求`选项。

[`创建用户`](create-user.html)允许这些*`tls_option`*价值观：

-   `没有`

    表示该语句命名的所有帐户都没有 SSL 或 X.509 要求。如果用户名和密码有效，则允许未加密的连接。如果客户端具有正确的证书和密钥文件，则可以根据客户端的选择使用加密连接。

    ```
    CREATE USER 'jeffrey'@'localhost' REQUIRE NONE;
    ```

    默认情况下，客户端尝试建立安全连接。对于拥有`不需要`，如果无法建立安全连接，则连接尝试回退到未加密的连接。要要求加密连接，客户端只需指定[`--ssl 模式=必需`](connection-options.html#option_general_ssl-mode)选项;如果无法建立安全连接，则连接尝试失败。

    `没有`如果没有 SSL 相关，则为默认值`要求`选项被指定。

-   `SSL`

    告诉服务器只允许该语句命名的所有帐户的加密连接。

    ```
    CREATE USER 'jeffrey'@'localhost' REQUIRE SSL;
    ```

    默认情况下，客户端尝试建立安全连接。对于拥有`需要 SSL`，如果无法建立安全连接，则连接尝试失败。

-   `X509`

    对于声明中指定的所有帐户，要求客户出示有效的证书，但确切的证书、颁发者和主题并不重要。唯一的要求是应该可以使用 CA 证书之一验证其签名。使用 X.509 证书总是意味着加密，所以`SSL`在这种情况下，选项是不必要的。

    ```
    CREATE USER 'jeffrey'@'localhost' REQUIRE X509;
    ```

    对于具有`需要 X509`，客户必须指定[`--ssl-key`](connection-options.html#option_general_ssl-key)和[`--ssl-证书`](connection-options.html#option_general_ssl-cert)连接选项。（建议但不要求[`--ssl-ca`](connection-options.html#option_general_ssl-ca)也可以指定，以便可以验证服务器提供的公共证书。）对于`发行人`和`主题`也因为那些`要求`选项意味着要求`X509`.

-   `发行人'*`发行人`*'`

    对于声明中指定的所有帐户，要求客户端出示由 CA 颁发的有效 X.509 证书`'*`发行人`*'`.如果客户端提供有效但具有不同颁发者的证书，则服务器拒绝连接。使用 X.509 证书总是意味着加密，所以`SSL`在这种情况下，选项是不必要的。

    ```
    CREATE USER 'jeffrey'@'localhost'
      REQUIRE ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
        O=MySQL/CN=CA/emailAddress=ca@example.com';
    ```

    因为`发行人`意味着要求`X509`，客户必须指定[`--ssl-key`](connection-options.html#option_general_ssl-key)和[`--ssl-证书`](connection-options.html#option_general_ssl-cert)连接选项。（建议但不要求[`--ssl-ca`](connection-options.html#option_general_ssl-ca)也可以指定，以便验证服务器提供的公共证书。）

-   `主题 '*`主题`*'`

    对于语句命名的所有帐户，要求客户端提供包含主题的有效 X.509 证书*`主题`*.如果客户端提供有效但具有不同主题的证书，则服务器拒绝连接。使用 X.509 证书总是意味着加密，所以`SSL`在这种情况下，选项是不必要的。

    ```
    CREATE USER 'jeffrey'@'localhost'
      REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
        O=MySQL demo client certificate/
        CN=client/emailAddress=client@example.com';
    ```

    MySQL 做一个简单的字符串比较`'*`主题`*'`证书中的值，因此字母大小写和组件订购必须与证书中的完全一致。

    因为`主题`意味着要求`X509`，客户必须指定[`--ssl-key`](connection-options.html#option_general_ssl-key)和[`--ssl-证书`](connection-options.html#option_general_ssl-cert)连接选项。（建议但不要求[`--ssl-ca`](connection-options.html#option_general_ssl-ca)也可以指定，以便验证服务器提供的公共证书。）

-   `密码'*`密码`*'`

    对于语句命名的所有帐户，需要特定的密码方法来加密连接。需要此选项以确保使用足够强度的密码和密钥长度。如果使用使用短加密密钥的旧算法，加密可能会很弱。

    ```
    CREATE USER 'jeffrey'@'localhost'
      REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
    ```

    这`主题`,`发行人`， 和`密码`选项可以组合在`要求`条款：


```
CREATE USER 'jeffrey'@'localhost'
  REQUIRE SUBJECT '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL demo client certificate/
    CN=client/emailAddress=client@example.com'
  AND ISSUER '/C=SE/ST=Stockholm/L=Stockholm/
    O=MySQL/CN=CA/emailAddress=ca@example.com'
  AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
```

##### CREATE USER 资源限制选项

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

可以限制帐户对服务器资源的使用，如中所述[第 6.2.21 节，“设置帐户资源限制”](user-resources.html).为此，请使用`和`指定一个或多个的子句*`资源选项`*价值观。

顺序`和`选项无关紧要，除非多次指定给定的资源限制，最后一个实例优先。

[`创建用户`](create-user.html)允许这些*`资源选项`*价值观：

-   `MAX_QUERIES_PER_HOUR *`数数`*`,`MAX_UPDATES_PER_HOUR *`数数`*`,`MAX_CONNECTIONS_PER_HOUR *`数数`*`

    对于语句命名的所有帐户，这些选项限制在任何给定的一小时期间允许每个帐户进行多少查询、更新和连接到服务器。如果*`数数`*是`0`（默认），这意味着对帐户没有限制。

-   `MAX_USER_CONNECTIONS *`数数`*`

    对于语句命名的所有帐户，限制每个帐户同时连接到服务器的最大数量。一个非零*`数数`*明确指定帐户的限制。如果*`数数`*是`0`（默认），服务器根据全局值确定帐户的同时连接数[`max_user_connections`](server-system-variables.html#sysvar_max_user_connections)系统变量。如果[`max_user_connections`](server-system-variables.html#sysvar_max_user_connections)也为零，帐户没有限制。

    例子：


```
CREATE USER 'jeffrey'@'localhost'
  WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;
```

##### 创建用户密码管理选项

[`创建用户`](create-user.html)支持几个*`密码选项`*密码管理值：

-   密码过期选项：您可以手动使帐户密码过期并建立其密码过期策略。策略选项不会使密码过期。相反，他们确定服务器如何根据密码年龄对帐户应用自动过期，密码年龄是从最近帐户密码更改的日期和时间评估的。

-   密码重用选项：您可以根据密码更改次数、已用时间或两者都限制密码重用。

-   密码验证要求选项：您可以指示更改帐户密码的尝试是否必须指定当前密码，以验证尝试进行更改的用户实际上知道当前密码。

-   Incorrect-password failed-login tracking options：您可以使服务器跟踪失败的登录尝试并暂时锁定提供了太多连续错误密码的帐户。所需的失败次数和锁定时间是可配置的。

    本节介绍密码管理选项的语法。有关建立密码管理策略的信息，请参阅[第 6.2.15 节，“密码管理”](password-management.html).

    如果指定了给定类型的多个密码管理选项，则最后一个优先。例如，`密码过期 默认密码从不过期`是相同的`密码永不过期`.

笔记

除了与登录失败跟踪有关的选项外，密码管理选项仅适用于使用身份验证插件的帐户，该插件在内部将凭据存储到 MySQL。对于使用针对 MySQL 外部凭证系统执行身份验证的插件的帐户，密码管理也必须在外部针对该系统进行处理。有关内部凭据存储的更多信息，请参阅[第 6.2.15 节，“密码管理”](password-management.html).

如果帐户密码手动过期或密码年龄被认为大于自动过期策略允许的生命周期，则客户端的密码已过期。在这种情况下，服务器要么断开客户端的连接，要么限制允许的操作（参见[第 6.2.16 节，“过期密码的服务器处理”](expired-password-handling.html)）。受限客户端执行的操作会导致错误，直到用户建立新的帐户密码。

[`创建用户`](create-user.html)允许这些*`密码选项`*控制密码过期的值：

-   `密码过期`

    立即将该语句命名的所有帐户的密码标记为过期。

    ```
    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE;
    ```

-   `密码过期默认`

    设置由语句命名的所有帐户，以便应用全局过期策略，如[`default_password_lifetime`](server-system-variables.html#sysvar_default_password_lifetime)系统变量。

    ```
    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE DEFAULT;
    ```

-   `密码永不过期`

    此到期选项会覆盖该语句命名的所有帐户的全局策略。对于每一个，它都会禁用密码过期，以便密码永不过期。

    ```
    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
    ```

-   `密码过期间隔 *`ñ`* 日`

    此到期选项会覆盖该语句命名的所有帐户的全局策略。对于每个，它将密码生命周期设置为*`ñ`*天。以下语句要求每 180 天更改一次密码：

    ```
    CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 180 DAY;
    ```

[`创建用户`](create-user.html)允许这些*`密码选项`*根据所需的最小密码更改次数控制先前密码的重复使用的值：

-   `密码历史默认值`

    设置由语句命名的所有帐户，以便应用有关密码历史长度的全局策略，以禁止在指定的更改次数之前重复使用密码[`密码历史`](server-system-variables.html#sysvar_password_history)系统变量。

    ```
    CREATE USER 'jeffrey'@'localhost' PASSWORD HISTORY DEFAULT;
    ```

-   `密码历史 *`ñ`*`

    这个历史长度选项会覆盖该语句命名的所有帐户的全局策略。对于每个，它将密码历史记录长度设置为*`ñ`*密码，以禁止重复使用任何*`ñ`*最近选择的密码。以下声明禁止重复使用前 6 个密码中的任何一个：

    ```
    CREATE USER 'jeffrey'@'localhost' PASSWORD HISTORY 6;
    ```

[`创建用户`](create-user.html)允许这些*`密码选项`*根据经过的时间控制重用先前密码的值：

-   `密码重用间隔默认值`

    设置由帐户命名的所有语句，以便应用有关已用时间的全局策略，以禁止重用比帐户指定的天数更新的密码[`password_reuse_interval`](server-system-variables.html#sysvar_password_reuse_interval)系统变量。

    ```
    CREATE USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL DEFAULT;
    ```

-   `密码重用间隔 *`ñ`* 日`

    这个经过时间的选项会覆盖该语句命名的所有帐户的全局策略。对于每个，它将密码重用间隔设置为*`ñ`*天，以禁止重复使用比该天数新的密码。以下声明禁止 360 天内重复使用密码：

    ```
    CREATE USER 'jeffrey'@'localhost' PASSWORD REUSE INTERVAL 360 DAY;
    ```

[`创建用户`](create-user.html)允许这些*`密码选项`*用于控制是否尝试更改帐户密码的值必须指定当前密码，以验证尝试进行更改的用户实际上知道当前密码：

-   `密码需要当前`

    此验证选项会覆盖该语句命名的所有帐户的全局策略。对于每一个，它都要求密码更改指定当前密码。

    ```
    CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT;
    ```

-   `密码需要当前可选`

    此验证选项会覆盖该语句命名的所有帐户的全局策略。对于每个，它不需要密码更改指定当前密码。（当前密码可能但不需要给出。）

    ```
    CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT OPTIONAL;
    ```

-   `密码需要当前默认值`

    设置由帐户命名的所有语句，以便应用有关密码验证的全局策略，如[`password_require_current`](server-system-variables.html#sysvar_password_require_current)系统变量。

    ```
    CREATE USER 'jeffrey'@'localhost' PASSWORD REQUIRE CURRENT DEFAULT;
    ```

    从 MySQL 8.0.19 开始，[`创建用户`](create-user.html)允许这些*`密码选项`*用于控制登录失败跟踪的值：

-   `FAILED_LOGIN_ATTEMPTS *`ñ`*`

    是否跟踪指定错误密码的帐户登录尝试。*`ñ`*必须是 0 到 32767 之间的数字。值 0 将禁用登录失败跟踪。大于 0 的值表示有多少连续密码失败导致临时帐户锁定（如果PASSWORD_LOCK_TIME`也是非零）。`PASSWORD_LOCK_TIME {\*

-   `ñ`\* |`无界}`

    连续多次登录尝试提供错误密码后锁定帐户多长时间。*`ñ`*必须是 0 到 32767 之间的数字，或`无界`.值 0 禁用临时帐户锁定。大于 0 的值表示锁定帐户的天数。一个值`无界`导致帐户锁定持续时间不受限制；一旦锁定，帐户将保持锁定状态，直到解锁。有关解锁条件的信息，请参阅[登录失败跟踪和临时帐户锁定](password-management.html#failed-login-tracking).

    为了发生登录失败跟踪和临时锁定，帐户的`FAILED_LOGIN_ATTEMPTS`和`PASSWORD_LOCK_TIME`选项都必须非零。以下语句创建了一个帐户，该帐户在连续四次密码失败后保持锁定两天：


```
CREATE USER 'jeffrey'@'localhost'
  FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 2;
```

##### CREATE USER 注释和属性选项

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

从 MySQL 8.0.21 开始，您可以创建一个带有可选注释或属性的帐户，如下所述：

-   **用户评论**

    要设置用户评论，请添加`评论 '*`用户评论`*'`到`创建用户`声明，其中*`用户评论`*是用户评论的文本。

    示例（省略任何其他选项）：

    ```
    CREATE USER 'jon'@'localhost' COMMENT 'Some information about Jon';
    ```

-   **用户属性**

    用户属性是由一个或多个键值对组成的 JSON 对象，通过包括`属性 '*`json_object`*'`作为的一部分`创建用户`.*`json_object`*必须是有效的 JSON 对象。

    示例（省略任何其他选项）：

    ```
    CREATE USER 'jim'@'localhost'
        ATTRIBUTE '{"fname": "James", "lname": "Scott", "phone": "123-456-7890"}';
    ```

    用户评论和用户属性一起存储在`属性`的列[`INFORMATION_SCHEMA.USER_ATTRIBUTES`](information-schema-user-attributes-table.html)桌子。此查询显示此表中由刚刚显示的用于创建用户的语句插入的行`吉姆@本地主机`：


```
mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->    WHERE USER = 'jim' AND HOST = 'localhost'\G
*************************** 1. row ***************************
     USER: jim
     HOST: localhost
ATTRIBUTE: {"fname": "James", "lname": "Scott", "phone": "123-456-7890"}
1 row in set (0.00 sec)
```

这`评论`实际上，选项提供了一种设置用户属性的快捷方式，该用户属性的唯一元素具有`评论`作为其键，其值是为选项提供的参数。您可以通过执行语句看到这一点`CREATE USER 'jon'@'localhost' COMMENT '关于 Jon 的一些信息'`，并观察它插入的行[`USER_ATTRIBUTES`](information-schema-user-attributes-table.html)桌子：

```
mysql> CREATE USER 'jon'@'localhost' COMMENT 'Some information about Jon';
Query OK, 0 rows affected (0.06 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    ->    WHERE USER = 'jon' AND HOST = 'localhost';
+------+-----------+-------------------------------------------+
| USER | HOST      | ATTRIBUTE                                 |
+------+-----------+-------------------------------------------+
| jon  | localhost | {"comment": "Some information about Jon"} |
+------+-----------+-------------------------------------------+
1 row in set (0.00 sec)
```

你不能使用`评论`和`属性`一起在同一个`创建用户`陈述;尝试这样做会导致语法错误。要在设置用户属性的同时设置用户评论，请使用`属性`并在其参数中包含一个带有 a 的值`评论`键，像这样：

```
mysql> CREATE USER 'bill'@'localhost'
    ->        ATTRIBUTE '{"fname":"William", "lname":"Schmidt",
    ->        "comment":"Website developer"}';
Query OK, 0 rows affected (0.16 sec)
```

由于内容`属性`row 是一个 JSON 对象，您可以使用任何适当的 MySQL JSON 函数或运算符来操作它，如下所示：

```
mysql> SELECT
    ->   USER AS User,
    ->   HOST AS Host,
    ->   CONCAT(ATTRIBUTE->>"$.fname"," ",ATTRIBUTE->>"$.lname") AS 'Full Name',
    ->   ATTRIBUTE->>"$.comment" AS Comment
    -> FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
    -> WHERE USER='bill' AND HOST='localhost';
+------+-----------+-----------------+-------------------+
| User | Host      | Full Name       | Comment           |
+------+-----------+-----------------+-------------------+
| bill | localhost | William Schmidt | Website developer |
+------+-----------+-----------------+-------------------+
1 row in set (0.00 sec)
```

要设置或更改现有用户的用户评论或用户属性，您可以使用`评论`要么`属性`选项[`更改用户`](alter-user.html)陈述。

因为用户评论和用户属性在内部存储在一个单一的[`JSON`](json.html)列，这设置了它们的最大组合大小的上限；看[JSON 存储要求](storage-requirements.html#data-types-storage-reqs-json)， 了解更多信息。

另见信息模式的描述[`USER_ATTRIBUTES`](information-schema-user-attributes-table.html)表以获取更多信息和示例。

##### 创建用户帐户锁定选项

[](<>)

MySQL 支持使用`帐户锁定`和`帐户解锁`选项，指定帐户的锁定状态。有关其他讨论，请参阅[第 6.2.20 节，“帐户锁定”](account-locking.html).

如果指定了多个帐户锁定选项，则最后一个优先。

##### CREATE USER 二进制日志

[](<>)

[`创建用户`](create-user.html)如果成功则写入二进制日志，但如果失败则不写入；在这种情况下，会发生回滚并且不会进行任何更改。写入二进制日志的语句包括所有命名用户。如果`如果不存在`子句，这甚至包括已经存在但尚未创建的用户。

写入二进制日志的语句为每个用户指定一个身份验证插件，确定如下：

-   原始语句中命名的插件（如果指定了一个）。

-   否则，默认身份验证插件。特别是，如果用户`u1`已经存在并使用非默认身份验证插件，即写入二进制日志的用于`如果不存在，则创建用户u1`命名默认的身份验证插件。（如果写入二进制日志的语句必须为用户指定非默认身份验证插件，请将其包含在原始语句中。）

    如果服务器在写入二进制日志的语句中为任何不存在的用户添加默认身份验证插件，它会向错误日志中写入一条警告，指明这些用户。

    如果原始语句指定`登录尝试失败`或`密码锁定时间`选项，写入二进制日志的语句包括该选项。

[`创建用户`](create-user.html)包含支持多因素身份验证（MFA）的子句的语句将写入二进制日志。

-   `创建用户。。。认同。。初始身份验证标识为。。。`语句以如下方式写入二进制日志：`创建用户。。认同。。用..标识的初始身份验证。。就像*`密码散列`*'`，在哪里*`密码散列`*是否指定了用户*`验证字符串`*或者当`随机密码`第条已指定。
