Documentation Home

6.2.4 指定账户名

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

帐户名称出现在 SQL 语句中,例如 CREATE USERGRANTSET PASSWORD并遵循以下规则:

  • 帐户名语法是 . 'user_name'@'host_name'

  • 该 部分是可选的。仅由用户名组成的帐户名等同于 . 例如,相当于 . @'host_name''user_name'@'%''me''me'@'%'

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

  • 使用反引号 ( `)、单引号 ( ') 或双引号 ( ") 将用户名和主机名作为标识符或字符串引用。有关字符串引用和标识符引用指南,请参阅 第 9.1.1 节,“字符串文字”第 9.2 节,“模式对象名称”

  • 如果引用用户名和主机名部分,则必须单独引用。即写 'me'@'localhost',不 写'me@localhost'。后者实际上相当于'me@localhost'@'%'.

  • CURRENT_USER 对or函数 的引用CURRENT_USER()等同于按字面指定当前客户端的用户名和主机名。

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

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

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

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

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

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

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

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

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

  • 主机名或 IP 地址值中允许 使用%和通配符。_这些与使用运算符执行的模式匹配操作具有相同的含义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 地址,不能匹配主机名。

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

    语法是 . 例如: host_ip/netmask

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

    这使得能够从具有以下条件为真的 davidIP 地址的任何客户端主机进行连接 :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 地址的主机

服务器使用系统 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 帐户名中使用相同格式的值。