### 6.2.4 指定帐户名称

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

MySQL 帐户名由一个用户名和一个主机名组成，它可以为从不同主机连接的具有相同用户名的用户创建不同的帐户。本节介绍帐户名称的语法，包括特殊值和通配符规则。

在大多数方面，帐户名称与 MySQL 角色名称相似，有一些不同之处描述在[第 6.2.5 节，“指定角色名称”](role-names.html).

帐户名称出现在 SQL 语句中，例如[`创建用户`](create-user.html),[`授予`](grant.html)， 和[`设置密码`](set-password.html)并遵循以下规则：

-   帐户名称语法是`'*`用户名`*'@'*`主机名`*'`.

-   这`@'*`主机名`*'`部分是可选的。仅由用户名组成的帐户名等效于`'*`用户名`*'@'%'`.例如，`'我'`相当于`“我”@“`.

-   如果用户名和主机名作为未加引号的标识符是合法的，则无需加引号。如果出现以下情况，则必须使用引号：*`用户名`*字符串包含特殊字符（例如空格或`-`)，或*`主机名`*字符串包含特殊字符或通配符（例如`.`或`%`)。例如，在帐户名中`“测试用户”@“%”。com'`，用户名和主机名部分都需要引号。

-   使用反勾号将用户名和主机名作为标识符或字符串引用(````)，单引号（```）或双引号（``）。有关字符串引用和标识符引用指南，请参阅[第9.1.1节，“字符串文字”]（string Literals.html）和[第9.2节，“模式对象名称”]（identifiers.html）。在[`SHOW`]（SHOW.html）语句结果中，用户名和主机名使用反勾(````).

-   用户名和主机名部分（如果引用）必须单独引用。也就是说，写`“我”@“本地主机”`不`'me@localhost'`.后者实际上相当于`'me@localhost'@'%'`.

-   提及[`当前用户`](information-functions.html#function_current-user)或[`当前用户（）`](information-functions.html#function_current-user)函数相当于按字面意思指定当前客户端的用户名和主机名。

    MySQL将帐户名存储在`mysql`系统数据库使用用户名和主机名部分的单独列：

-   这个`使用者`表中每个帐户包含一行。这个`使用者`和`主办`列存储用户名和主机名。此表还指示帐户具有哪些全局权限。

-   其他grant表表示帐户对数据库和数据库内对象的权限。这些桌子有`使用者`和`主办`用于存储帐户名的列。这些表中的每一行都与`使用者`具有相同`使用者`和`主办`价值观

-   出于访问检查的目的，用户值的比较区分大小写。主机值的比较不区分大小写。

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

    有关存储在授权表中的用户名和主机名属性（如最大长度）的更多详细信息，请参阅[授予表作用域列属性](grant-tables.html#grant-tables-scope-column-properties).

    用户名和主机名具有某些特殊值或通配符约定，如下所述。

    帐户名的用户名部分可以是一个与传入连接尝试的用户名完全匹配的非空值，也可以是一个与任何用户名匹配的空值（空字符串）。用户名为空的帐户是匿名用户。要在SQL语句中指定匿名用户，请使用带引号的空用户名部分，例如`''@'本地主机'`.

    帐户名的主机名部分可以采用多种形式，并且允许使用通配符：

-   主机值可以是主机名或IP地址（IPv4或IPv6）。名字`“本地主机”`指示本地主机。IP地址`'127.0.0.1'`指示IPv4环回接口。IP地址`'::1'`指示IPv6环回接口。

-   这个`%`和`_`主机名或IP地址值中允许使用通配符。这些与使用[`喜欢`](string-comparison-functions.html#operator_like)操作人员例如，主机值为`'%'`匹配任何主机名，而`'%.mysql。com'`匹配中的任何主机`mysql。通用域名格式`领域`'198.51.100.%'`匹配198.51.100 C类网络中的任何主机。

    [](<>)

    因为主机值中允许IP通配符值（例如，`'198.51.100.%'`为了匹配子网中的每台主机），有人可以通过命名主机来尝试利用此功能`198.51.100.在某处通用域名格式`.为了阻止这种尝试，MySQL不会对以数字和点开头的主机名执行匹配。例如，如果主机名为`1.2.实例通用域名格式`，其名称与帐户名的主机部分不匹配。IP通配符值只能匹配IP地址，不能匹配主机名。

-   对于指定为IPv4地址的主机值，可以提供一个网络掩码来指示网络号要使用多少地址位。网络掩码符号不能用于IPv6地址。

    [](<>)

    语法是`*`主持人(ip)`*/*`网络掩码`*`.例如：

    ```
    CREATE USER 'david'@'198.51.100.0/255.255.255.0';
    ```

    这使得`大卫`从任何具有IP地址的客户端主机连接*`客户ip`*以下条件为真：

    ```
    client_ip & netmask = host_ip
    ```

    也就是说[`创建用户`](create-user.html)刚才的声明显示：

    ```
    client_ip & 255.255.255.0 = 198.51.100.0
    ```

    满足此条件的IP地址范围为`198.51.100.0`到`198.51.100.255`.

    网络掩码通常以设置为1的位开始，然后是设置为0的位。例如：

    -   `198.0.0.0/255.0.0.0`：198 A类网络上的任何主机

    -   `198.51.0.0/255.255.0.0`：198.51 B类网络上的任何主机

    -   `198.51.100.0/255.255.255.0`：198.51.100 C类网络上的任何主机

    -   `198.51.100.1`：仅具有此特定IP地址的主机

-   从MySQL 8.0.23开始，可以使用CIDR表示法写入指定为IPv4地址的主机值，例如`198.51.100.44/24`.

     [](<>)

    服务器使用系统DNS解析程序为客户端主机名或IP地址返回的值，将帐户名中的主机值与客户端主机进行匹配。除了使用网络掩码表示法指定帐户主机值的情况外，服务器将以字符串匹配的方式执行此比较，即使对于作为IP地址给定的帐户主机值也是如此。这意味着您应该以DNS使用的相同格式指定帐户主机值。以下是需要注意的问题示例：

-   假设本地网络上的主机有一个完全限定的名称`1号旅社。实例通用域名格式`。如果DNS将此主机的名称查找返回为`1号旅社。实例通用域名格式`，在帐户主机值中使用该名称。如果DNS返回`1号旅社`使用`1号旅社`相反

-   如果DNS将给定主机的IP地址返回为`198.51.100.2`，它与帐户主机值匹配`198.51.100.2`但不是`198.051.100.2`.类似地，它与帐户主机模式匹配，如`198.51.100.%`但不是`198.051.100.%`.

    为了避免此类问题，建议检查DNS返回主机名和地址的格式。在MySQL帐户名中使用相同格式的值。
