账号控制与账户管理
指定账户名称
MySQL帐户名由一个用户名和一个主机名组成,可以为从不同主机连接的具有相同用户名的用户创建不同的帐户。本节介绍帐户名的语法,包括特殊值和通配符规则。
在大多数方面,帐户名称与 MySQL 角色名称相似,但在Specifying Role Name中的描述了一些差异。
帐户名称出现在 CREATE USER、GRANT
和 SET PASSWORD
等 SQL 语句中,并遵循以下规则:
-
帐户名称语法是
'user_name'@'host_name'
。 -
@'host_name'
部分是可选的。只包含用户名的帐户名相当于'user_name'@'%'
。例如,'me'
等价于'me'@'%'
。 -
如果用户名和主机名作为未加引号的标识符是合法的,则不需要加引号。如果
user_name
字符串包含特殊字符(如空格或-
),或者host_name
字符串包含特殊字符或通配符(如.
或%
)。例如,在帐户名'test-user'@'%.com'
中,用户名和主机名部分都需要引号。 -
用户名和主机名部分必须使用引号。也就是说,写
'me'@'localhost'
,而不是’me@localhost’。后者实际上相当于'me@localhost'@'%'
。 -
对
CURRENT_USER
或CURRENT_USER()
函数的引用等效于从字面上指定当前客户端的用户名和主机名。
MySQL 将帐户名称存储在 mysql
系统数据库的授权表中,用户名和主机名部分使用单独的列存储:
-
user
表为每个帐户包含一行。用户和主机列存储用户名和主机名。此表还指示帐户具有哪些全局权限。 -
其他授权表表示帐户对数据库和数据库中对象的权限。这些表有
User
和Host
列来存储帐户名称。这些表中的每一行都与user
表中具有相同User
和Host
值的帐户相关联。 -
出于访问检查目的,
User
值的比较区分大小写。Host
值的比较不区分大小写。
有关存储在授权表中的用户名和主机名属性的更多详细信息,例如最大长度,请参Grant Table Scope Column Properties。
用户名和主机名具有某些特殊值或通配符约定,如下所述。
帐户名的用户名部分要么是与传入连接的用户名字面匹配的非空值,要么是与任何用户名匹配的空值(空字符串)。具有空白用户名的帐户是匿名用户。要在 SQL 语句中指定匿名用户,请使用带引号的空用户名部分,例如 ''@'localhost'
。
帐户名的主机名部分可以采用多种形式,并且允许使用通配符:
-
主机值可以是主机名或
IP
地址(IPv4
或IPv6
)。名称localhost
表示本地主机。IP
地址127.0.0.1
表示IPv4
环回接口。 IP 地址::1
表示 ~ 环回接口。 -
主机名或
IP
地址值中允许使用 % 和_
通配符。这些与使用LIKE
运算符执行的模式匹配操作具有相同的含义。例如,主机值'%'
匹配任何主机名,而值'%.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
的客户端主机进行连接。满足此条件的
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
。