文档首页
MySQL 8.4 参考手册
相关文档 下载此手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  指定帐户名称

8.2.4 指定帐户名称

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

在大多数方面,帐户名称类似于 MySQL 角色名称,一些差异在第 8.2.5 节,“指定角色名称”中描述。

帐户名称出现在诸如CREATE USERGRANTSET PASSWORD 之类的 SQL 语句中,并遵循以下规则

  • 帐户名称语法为 'user_name'@'host_name'

  • @'host_name' 部分是可选的。仅由用户名组成的帐户名称等效于 'user_name'@'%'。例如,'me' 等效于 'me'@'%'

  • 如果用户名和主机名在作为未引用的标识符时是合法的,则它们不需要被引用。如果 user_name 字符串包含特殊字符(如空格或 -),或者 host_name 字符串包含特殊字符或通配符(如 .%),则必须使用引号。例如,在帐户名称 'test-user'@'%.com' 中,用户名和主机名部分都需要引号。

  • 使用反引号 (`),单引号 (') 或双引号 (") 将用户名和主机名作为标识符或字符串引用。有关字符串引用和标识符引用指南,请参见第 11.1.1 节,“字符串文字”第 11.2 节,“架构对象名称”。在SHOW 语句结果中,用户名和主机名使用反引号 (`) 引用。

  • 如果引用了用户名和主机名部分,则必须分别引用它们。也就是说,写 'me'@'localhost',而不是 'me@localhost'。(后者实际上等效于 'me@localhost'@'%',尽管这种行为现在已弃用。)

  • CURRENT_USERCURRENT_USER() 函数的引用等效于按字面意义指定当前客户端的用户名和主机名。

MySQL 在 mysql 系统数据库中的授权表中存储帐户名称,使用单独的列来存储用户名和主机名部分

  • user 表包含每个帐户的一行。 UserHost 列存储用户名和主机名。该表还指示帐户具有哪些全局权限。

  • 其他授权表指示帐户对数据库和数据库中的对象具有的权限。这些表具有 UserHost 列来存储帐户名称。这些表中的每一行都与 user 表中具有相同 UserHost 值的帐户相关联。

  • 出于访问检查的目的,对 User 值的比较区分大小写。对 Host 值的比较不区分大小写。

有关在授权表中存储的用户名和主机名的属性的更多详细信息,例如最大长度,请参见授权表范围列属性

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

帐户名的用户名部分可以是与传入连接尝试的用户名完全匹配的非空值,也可以是与任何用户名匹配的空值(空字符串)。具有空用户名的帐户是匿名用户。要在 SQL 语句中指定匿名用户,请使用带引号的空用户名部分,例如 ''@'localhost'

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

  • 主机值可以是主机名或 IP 地址(IPv4 或 IPv6)。名称 'localhost' 指示本地主机。IP 地址 '127.0.0.1' 指示 IPv4 环回接口。IP 地址 '::1' 指示 IPv6 环回接口。

  • 允许在主机名或 IP 地址值中使用 %_ 通配符,但已弃用,因此可能在 MySQL 的未来版本中被删除。这些字符与使用 LIKE 运算符执行的模式匹配操作具有相同的含义。例如,主机值为 '%' 与任何主机名匹配,而值为 '%.mysql.com'mysql.com 域中的任何主机匹配。 '198.51.100.%' 与 198.51.100 类 C 网络中的任何主机匹配。

    由于允许在主机值中使用 IP 通配符值(例如,'198.51.100.%' 与子网上的每个主机匹配),因此有人可能会尝试通过将主机命名为 198.51.100.somewhere.com 来利用此功能。为了阻止此类尝试,MySQL 不会对以数字和点开头的主机名执行匹配。例如,如果主机名为 1.2.example.com,则其名称永远不会与帐户名的主机部分匹配。IP 通配符值只能与 IP 地址匹配,而不能与主机名匹配。

    如果 partial_revokesON,MySQL 会将授权中的 %_ 视为文字字符,而不是通配符。使用这些通配符已弃用(无论此变量的值如何);您应该预期此功能将在 MySQL 的未来版本中被删除。

  • 对于指定为 IPv4 地址的主机值,可以给出网络掩码以指示要用于网络号的地址位数。网络掩码表示法不能用于 IPv6 地址。

    语法为 host_ip/netmask。例如

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

    这允许 david 从任何具有 IP 地址 client_ip 的客户端主机连接,只要以下条件为真

    client_ip & netmask = host_ip

    也就是说,对于刚刚显示的 CREATE USER 语句

    client_ip & 255.255.255.0 = 198.51.100.0

    满足此条件的 IP 地址范围从 198.51.100.0198.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 地址的主机

  • 指定为 IPv4 地址的主机值可以使用 CIDR 表示法来编写,例如 198.51.100.44/24

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

  • 假设本地网络上的主机具有完全限定域名 host1.example.com。如果 DNS 为此主机返回的名称查找为 host1.example.com,请在帐户主机值中使用该名称。如果 DNS 只返回 host1,则改为使用 host1

  • 如果 DNS 为给定主机返回的 IP 地址为 198.51.100.2,则它与帐户主机值为 198.51.100.2 匹配,但不与 198.051.100.2 匹配。同样,它与 198.51.100.% 这样的帐户主机模式匹配,但不与 198.051.100.% 匹配。

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