MySQL 帐户名由用户名和主机名组成,这使得从不同主机连接的具有相同用户名的用户可以创建不同的帐户。本节介绍帐户名称的语法,包括特殊值和通配符规则。
在大多数方面,帐户名称类似于 MySQL 角色名称,第 6.2.5 节“指定角色名称”中描述了一些差异。
帐户名称出现在 SQL 语句中,例如
CREATE USER
、
GRANT
和SET
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 节,“模式对象名称”。在SHOW
语句结果中,用户名和主机名使用反引号 (`
) 引用。如果引用用户名和主机名部分,则必须单独引用。即写
'me'@'localhost'
,不 写'me@localhost'
。后者实际上相当于'me@localhost'@'%'
.CURRENT_USER
对or函数 的引用CURRENT_USER()
等同于按字面指定当前客户端的用户名和主机名。
MySQL 将帐户名存储在
mysql
系统数据库的授权表中,使用单独的列作为用户名和主机名部分:
有关存储在授权表中的用户名和主机名属性的更多详细信息,例如最大长度,请参阅 授权表范围列属性。
用户名和主机名具有某些特殊值或通配符约定,如下所述。
帐户名的用户名部分要么是一个与传入连接尝试的用户名字面匹配的非空值,要么是一个与任何用户名匹配的空值(空字符串)。具有空白用户名的帐户是匿名用户。要在 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';
这使得能够从具有以下条件为真的
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.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 开始,指定为 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 帐户名中使用相同格式的值。