6.2.4 指定帐户名
MySQL 帐户名包含一个用户名和一个主机名,从而可以为具有相同用户名且可以从不同主机进行连接的用户创建不同的帐户。本节介绍如何编写帐户名称,包括特殊值和通配符规则。
在CREATE USER,GRANT和SET PASSWORD之类的 SQL 语句中,帐户名称遵循以下规则:
-
帐户名语法为
'user_name'@'host_name'
。 -
仅由用户名组成的帐户名等效于
'user_name'@'%'
。例如,'me'
等效于'me'@'%'
。 -
如果用户名和主机名是合法的,则无需用引号引起来。必须使用引号来指定包含特殊字符(例如空格或
-
)的*user_name
字符串,或包含特殊字符或通配符(例如.
或%
)的host_name
*字符串。例如,在帐户名'test-user'@'%.com'
中,用户名和主机名部分都需要加引号。 -
使用反引号(``''),单引号(
'
)或双引号("
)将用户名和主机名作为标识符或字符串引号。有关字符串引用和标识符引用的准则,请参见第 9.1.1 节“字符串 Literals”和第 9.2 节“架构对象名称”。 -
用户名和主机名部分(如果带引号)必须分开引号。也就是说,写
'me'@'localhost'
而不是'me@localhost'
。后者实际上等效于'me@localhost'@'%'
。 -
对CURRENT_USER或CURRENT_USER()函数的引用等效于从字面上指定当前 Client 端的用户名和主机名。
MySQL 使用用户名和主机名部分的单独列将帐户名存储在mysql
系统数据库的授权 table 中:
-
user
table 为每个帐户包含一行。User
和Host
列存储用户名和主机名。该 table 还指示该帐户具有哪些全局特权。 -
其他授权 table 指示帐户具有数据库和数据库中对象的特权。这些 table 具有
User
和Host
列以存储帐户名称。这些 table 中的每一行都与user
table 中具有相同User
和Host
值的帐户相关联。 -
为了进行访问检查,用户值的比较区分大小写。主机值的比较不区分大小写。
有关授权 table 中存储的用户名和主机名属性的其他详细信息,例如最大长度,请参见授予 table 范围列属性。
用户名和主机名具有某些特殊值或通配符约定,如下所述。
帐户名的用户名部分可以是一个与 Importing 连接尝试的用户名在字面上匹配的非空值,或者是一个与任何用户名匹配的空值(空字符串)。用户名为空的帐户是匿名用户。要在 SQL 语句中指定匿名用户,请使用带引号的空用户名部分,例如''@'localhost'
。
帐户名的主机名部分可以采用多种形式,并且可以使用通配符:
-
主机值可以是主机名或 IP 地址(IPv4 或 IPv6)。名称
'localhost'
table 示 localhost。 IP 地址'127.0.0.1'
table 示 IPv4 环回接口。 IP 地址'::1'
table 示 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 地址,不能匹配主机名。
语法为host_ip/netmask
。例如:
CREATE USER 'david'@'198.51.100.0/255.255.255.0';
这使david
从具有以下条件的 IP 地址* client_ip
*的任何 Client 端主机进行连接:
client_ip & netmask = host_ip
也就是说,对于刚刚显示的CREATE USER语句:
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.100.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 解析器返回的 Client 端主机名或 IP 地址的值,将帐户名中的主机值与 Client 端主机进行匹配。除了使用网络掩码符号指定帐户主机值的情况之外,服务器甚至会以字符串匹配的形式执行此比较,即使是将帐户主机值指定为 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 帐户名称中使用相同格式的值。