首页 > 编程笔记 > MySQL笔记 阅读:2

MySQL user用户表详解(新手必看)

MySQL 服务器通过权限表来控制用户对数据库的访问。权限表被存放在系统库 mysql 中,MySQL 数据库系统会根据权限表的内容授予每个用户相应的权限。

MySQL 中非常重要的权限表有 user、db、tables_priv、columns_priv、procs_priv 等。

user 表用于记录用户账号和权限信息,它有 51 个字段。可以使用如下语句查看 user 表结构,其中包含字段信息(限于篇幅,此处仅展示部分数据):
mysql> DESC mysql.user;
+--------------+---------------+------+-----+---------+-------+
| Field        | Type          | Null | Key | Default | Extra |
+--------------+---------------+------+-----+---------+-------+
| Host         | char(255)     | NO   | PRI |         |       |
| User         | char(32)      | NO   | PRI |         |       |
| Select\_priv | enum('N','Y') | NO   |     | N       |       |
| Insert\_priv | enum('N','Y') | NO   |     | N       |       |
| Update\_priv | enum('N','Y') | NO   |     | N       |       |
| Delete\_priv | enum('N','Y') | NO   |     | N       |       |
| Create\_priv | enum('N','Y') | NO   |     | N       |       |
| Drop\_priv   | enum('N','Y') | NO   |     | N       |       |
| Reload\_priv | enum('N','Y') | NO   |     | N       |       |
这些字段可以分为 4 类,分别是用户列、权限列、安全列和资源控制列。

user表用户列

user 表中的用户列有 Host、User、authentication_string 3 个字段,分别表示主机名、用户名和密码。其中,Host 和 User 为 user 表的联合主键。

MySQL 中用主机名、用户名组合标识一个完整的用户,形式为“用户名@主机名”。这 3 个字段的值就是创建用户时保存的用户信息。我们可以直接从数据库中查询字段信息,结果如下所示:
mysql> SELECT User, Host, authentication_string
       FROM user
       WHERE User='root' AND Host='%';
+------+------+--------------------------------------------+
| User | Host | authentication\_string                     |
| root | %    | *CB588AAE96BA3780D597CEF19CE7A29C9F4AF3D4  |
+------+------+--------------------------------------------+
1 row in set (0.00 sec)

例如,前面使用的 root 用户对应的 Host、User 字段信息分别是“%”、“root”,而密码信息是加密后的数据,主要用来保证数据库的安全。在登录数据库的时候,需要三者完全匹配才可以成功登录。

user表权限列

user 表权限列中的字段决定了用户权限,描述了在全局范围内允许用户对数据和数据库执行的操作,既包括查询权限、修改权限等普通权限,也包括关闭服务器、超级权限、加载用户等高级权限,普通权限用于操作数据库,高级权限用于管理数据库。这些字段的数据类型为枚举类型,取值只能是 Y 和 N,Y 表示该用户拥有对应的权限,N 表示该用户没有对应的权限。

从 user 表结构中可以看到,这些字段的值默认都是 N。如果要修改用户权限,则可以使用 GRANT 语句或 UPDATE 语句更改 user 表权限列中这些字段的值。

user表安全列

user 表中的安全列有 6 个字段,其中:

user表资源控制列

user 表中的资源控制列有 4 个字段,用来限制用户使用的资源:

user表字段的含义

可以使用如下 SQL 语句查看当前数据库有哪些用户。如果需要以列的方式显示数据,则只需在 SQL 语句后面加上“\G”即可。
SELECT * FROM mysql.user;
SELECT * FROM mysql.user\G;

也可以使用如下 SQL 语句查询特定字段,其中的查询字段也可以换成其他字段:
mysql> SELECT Host, User, authentication_string, Select_priv
       FROM mysql.user\G;
*************************** 1. row ***************************
             Host: %
             User: root
authentication_string: *CB588AAE96BA3780D597CEF19CE7A29C9F4AF3D4
        Select_priv: Y
*************************** 2. row ***************************
             Host: localhost
             User: mysql.infoschema
authentication_string: $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED
        Select_priv: Y
*************************** 3. row ***************************
             Host: localhost
             User: mysql.session
authentication_string: $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED
        Select_priv: N
*************************** 4. row ***************************
             Host: localhost
             User: mysql.sys
authentication_string: $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED
        Select_priv: N
4 rows in set (0.00 sec)
可以看到,当前数据库有 4 个用户。上述查询结果中有 4 个字段,各字段的含义如下:
1) Host 字段表示主机名。有如下几种取值:
2) User 字段表示用户名。同一用户通过不同方式连接获得的权限是不一样的。

3) authentication_string 字段表示密码。所有密码串都是通过明文字符串生成的密文字符串。MySQL 8.0 在用户管理方面增加了角色管理,对默认的密码加密方式也进行了调整,由 SHA1 改为 SHA2,SHA2 和 SHA1 一样是不可逆的。MySQL 8.0 在用户管理方面的功能和安全性都较以前的版本大大增强。在 MySQL 5.7 以前的版本中,密码被保存在 password 字段中;而在 MySQL 5.7 及以后的版本中,使用 authentication_string 字段代替了 password 字段。

4) Select_priv 字段表示用户是否拥有查询表中数据的权限。

相关文章