Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Specifying Account Names

8.2.4 指定账户名称

MySQL 账户名由用户名和主机名组成,可以创建具有相同用户名但连接不同主机的用户不同的帐户。本节描述了帐户名的语法,包括特殊值和通配规则。

在大多数方面,账户名与 MySQL 角色名相似,但有一些差异,请参见 Section 8.2.5, “Specifying Role Names”

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

  • 账户名语法为 'user_name'@'host_name'

  • 如果没有指定主机名,账户名只包含用户名部分,则相当于 'user_name'@'%'。例如,'me' 等同于 'me'@'%'

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

  • 用引号引用用户名称和主机名称,可以使用反引号(`)、单引号(')或双引号(")。关于字符串引用的指导,请参见 Section 11.1.1, “String Literals”,和 Section 11.2, “Schema Object Names”。在 SHOW 语句结果中,用户名称和主机名称使用反引号(`)进行引用。

  • 如果引号了用户名和主机名,则必须分别引号。也就是说,要写 'me'@'localhost',而不是 'me@localhost'。(后者实际上等同于 'me@localhost'@'%',但现在已被弃用。)

  • CURRENT_USERCURRENT_USER() 函数的引用等同于指定当前客户端的用户名和主机名。

MySQL 将账户名称存储在授权表中,使用 mysql 系统数据库中的不同列来存储用户名和主机名部分:

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

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

  • 为了访问检查目的,比较 User 值是区分大小写的。比较 Host 值不是区分大小写的。

关于用户名称和主机名称在授权表中存储的属性的详细信息,如最大长度,请参阅Grant Table Scope Column Properties

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

帐户名部分是非空值,用于匹配传入连接尝试的用户名称,或为空值(空字符串)以匹配任何用户名称。具有空用户名称的帐户是一个匿名用户。在 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\_revokes设置为ON,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地址的主机

  • 使用CIDR表示法指定IPv4地址的主机值,可以写成 198.51.100.44/24

服务器将客户端主机的DNS解析器返回的值与帐户名称中的主机值进行匹配。除非使用网掩码表示法指定帐户主机值,否则服务器会以字符串匹配方式执行此比较,即使给定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帐户名称中的相同格式值。