MySQL 帐号命名规则 - xiaoboluo768/mysql-system-schema GitHub Wiki

  • MySQL的帐户由用户名和主机名两部分组成(例如:user_name@host_name)。采用这种方式Server就可以区分相同用户来自不同主机的连接,本小节将介绍如何编写有效的帐户名称(包括特殊值和通配符规则),对于使用SQL语句CREATE USER、GRANT和SET PASSWORD来操作用户的,都遵循以下规则:
  • 帐户名称构成语法:'user_name'@'host_name'
  • 仅由用户名组成的帐户名相当于'user_name'@'%'。例如:'me'相当于'me'@'%'
  • 如果用户名称和主机名称的字符串是合法的非引用标识符(即,不包含sql中的关键字或命令字),则不需要使用反撇进行引用。如果用户名或主机名的字符串中包含特殊字符(如空格或者- 符号)或者通配符(如:点号或者%号),则需要使用单引号或者双引号引起来,例如:'test-user'@'%.com'(注意:一旦使用引号, 注意'me@localhost'和'me'@'localhost'的含义是不同的,'me@localhost' 实际上在使用的时候,MySQL是解析为'me@localhost'@'%' ,而不是'me'@'localhost'),如果用户名或主机名不包含引用字符或特殊字符等,可不需要使用分撇和引号,但为了规范起见,建议至少对主机名和用户名使用引号,例如:'me'@'localhost'
  • 对CURRENT_USER关键字和CURRENT_USER()函数在查询语句中的效果相同,例如:select current_user; 和 select current_user(); 两个语句的查询结果相同,都是返回当前连接的帐号名
  • MySQL 中的帐号名在mysql系统字典库中的权限表user 表中存储时,会将user_name和host_name分开存储在user和host两列中:
  • user表中存储的帐号信息中,每个帐号包含一行记录。user和host列存储帐号对应的用户名和主机名,其他列存储了帐号对应的权限和帐号的其他属性信息
  • 其他权限表保存着帐户对实例中的库级别,表级别,列级别等权限信息。这些表与user表一样,也使用user和host列来分别存储帐号对应用户名和主机名。这些表保存着不同权限作用域的权限信息等(例如:db、columns_priv、procs_priv、proxies_priv、tables_priv,但这些表中并不保存密码信息)
  • 为了进行帐号的访问检查,用户名严格区分大小写,但主机名不区分大小写
  • 关于帐号用户名和主机名中某些特殊值或通配符约定,如下:
  • 默认情况下,user表中保存着一些匿名帐号,所以,默认情况下MySQL允许匿名帐号连接(即,user_name为空的帐号,但使用匿名帐号需要使用引号,如:''@ localhost')
  • 帐户名称中的host_name部分可以使用多种形式,并且允许使用通配符,如下:

* 主机名字符串可以是域名或操作系统主机名(需要DNS解析服务),也可以是IP地址(IPv4或IPv6)。对于域名,'localhost'表示本地主机,“127.0.0.1”表示IPv4的环回接口,':: 1'表示IPv6的环回接口

* 主机名或IP地址值中都允许使用通配符%和_。这些与LIKE运算符中的通配符含义相同。例如,“%”表示匹配任意主机名,而“%.mysql.com”表示匹配mysql.com域中的任何主机,'192.51.100.%'表示匹配C类私有网络192.51.100中的任意主机,由于主机名允许使用IP+通配符值(例如:“192.51.100.%”匹配192.51.100子网上的任意主机),为了阻止有人通过192.51.100.somewhere.com 格式的主机名字符串构造来尝试扫描存活主机,MySQL不会在以数字和点开头的主机名上执行匹配动作。例如:如果主机名部分为1.2.example.com,则直接被MySQL忽略, IP地址只能使用通配符组合,而不能与主机名进行组合,否则也会被忽略

* 对于指定为IPv4地址的主机名,可以结合子网掩码来控制子网IP数量(注意:子网掩码不使用IPV6),格式:host_ip/netmask。例如:CREATE USER 'david'@'192.51.100.0/255.255.255.0';,表示用户名为david,主机名为192.51.100.0子网下的任意主机,满足此条件的客户端主机IP地址范围从192.51.100.0到192.51.100.255

  • 对于MySQL帐号名的主机名部分为IP时,子网掩码ABC网络都支持,例如:
  • 192.0.0.0/255.0.0.0:掩码8位,表示192 A类网络上的任何主机
  • 192.51.100.0/255.255.0.0:掩码16位,表示192.51 B类网络上的任何主机
  • 192.51.100.0/255.255.255.0:掩码24位,表示192.51.100 C类网络上的任何主机
  • 192.51.100.1:不带掩码,表示仅匹配具有此特定IP地址的主机
  • MySQL Server使用DNS解析时,需要注意以下问题:
  • 假设本地网络上的主机具有host1.example.com的完全限定名称(DNS地址)。如果DNS将此主机解析为host1.example.com返回,则在MySQL帐号名的主机名部分也需要使用host1.example.com,如果DNS解析仅返回为host1,则在MySQL帐号名的主机名部分也需要使用host1,否则会被拒绝连接
  • 如果DNS返回的是IP地址192.51.100.2,那么它将优先进行IP地址的精确匹配,然后匹配对应网络的通配符,但不匹配非法的IP地址(例如:192.51.100.2)或子网(例如:192.51.100.%)

上一篇:MySQL 提供了哪些权限 |下一篇:第一阶段(帐号和密码认证)

⚠️ **GitHub.com Fallback** ⚠️