查询 mysql.user 表
所有在 MySQL 服务器上创建的用户信息都存储在 mysql 数据库的 user 表中,这是最直接、最权威的查看方式。

查看所有用户及其主机
这个命令会列出所有用户以及他们可以从哪些主机连接到 MySQL 服务器。
SELECT host, user FROM mysql.user;
示例输出:
+-----------+------------------+
| host | user |
+-----------+------------------+
| localhost | root |
| 127.0.0.1 | root |
| ::1 | root |
| localhost | debian-sys-maint |
| % | myapp_user |
+-----------+------------------+
解释:
host: 指定了用户可以从哪个主机地址连接。localhost: 只能从本机(通过 Unix socket 或 TCP/IP 环回地址)连接。0.0.1: 只能从本机的 TCP/IP 环回地址连接。:1: IPv6 的环回地址。- 通配符,表示从任何主机都可以连接(即远程连接),这是一个安全风险,应谨慎使用。
user: 用户名。
查看特定用户的完整权限信息
如果你想了解一个用户拥有哪些具体的权限(SELECT, INSERT, UPDATE 等),你需要查询 mysql 数据库中的多个权限表。

mysql.user 表存储了用户的全局权限(对所有数据库都有效),而 mysql.db, mysql.tables_priv, mysql.columns_priv 等表则存储了更细粒度的数据库、表、列级别的权限。
要查看一个用户的全部权限,可以执行以下查询:
-- 查看用户 'myapp_user' 的所有权限 SHOW GRANTS FOR 'myapp_user'@'%';
示例输出:
+-----------------------------------------------------------------------------------------------------------------+
| Grants for myapp_user@% |
+-----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'myapp_user'@'%' IDENTIFIED BY PASSWORD '*...' |
| GRANT SELECT, INSERT, UPDATE ON `my_database`.* TO 'myapp_user'@'%' |
+-----------------------------------------------------------------------------------------------------------------+
解释:

USAGE ON *.*: 表示该用户没有任何全局权限(除了连接和认证的权限)。GRANT SELECT, INSERT, UPDATE ON my_database.*: 表示该用户对my_database下的所有表拥有SELECT,INSERT,UPDATE权限。
查看当前登录的用户
如果你想确认你当前正在使用哪个用户身份登录,可以使用 CURRENT_USER() 函数。
SELECT CURRENT_USER();
示例输出:
+----------------+
| CURRENT_USER() |
+----------------+
| root@localhost |
+----------------+
这个结果告诉你,当前会话的用户是 root,并且是从 localhost 连接的。
常用查询场景和组合命令
只显示可以远程登录的用户
如果你想快速找出所有可以从外部服务器连接的用户(即 host 字段不是 localhost 的用户),可以这样做:
SELECT host, user FROM mysql.user WHERE host != 'localhost';
或者更精确地,查找 host 为 或包含 IP 地址的用户:
SELECT host, user FROM mysql.user WHERE host = '%' OR host NOT IN ('localhost', '127.0.0.1', '::1');
查看用户创建语句
如果你想查看创建某个用户的原始 SQL 命令(包含密码哈希值),可以使用 SHOW CREATE USER 命令。
SHOW CREATE USER 'myapp_user'@'%';
示例输出:
+-----------+----------------------------------------------------------------------------------------------------------------------------------+
| User | Create User |
+-----------+----------------------------------------------------------------------------------------------------------------------------------+
| myapp_user@% | CREATE USER 'myapp_user'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*...' PASSWORD EXPIRE NEVER PASSWORD HISTORY DEFAULT |
| | PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT |
+-----------+----------------------------------------------------------------------------------------------------------------------------------+
这对于备份用户配置或理解用户的认证方式很有用。
总结表格
| 命令 | 功能 | 示例 |
|---|---|---|
SELECT host, user FROM mysql.user; |
查看所有用户及其允许连接的主机 | SELECT host, user FROM mysql.user; |
SHOW GRANTS FOR 'user'@'host'; |
查看特定用户的详细权限 | SHOW GRANTS FOR 'myapp_user'@'%'; |
SELECT CURRENT_USER(); |
查看当前登录的用户 | SELECT CURRENT_USER(); |
SELECT host, user FROM mysql.user WHERE host != 'localhost'; |
查看所有可以远程登录的用户 | SELECT host, user FROM mysql.user WHERE host != 'localhost'; |
SHOW CREATE USER 'user'@'host'; |
查看创建用户的原始SQL语句 | SHOW CREATE USER 'myapp_user'@'%'; |
注意事项
- 权限要求: 执行这些查询通常需要你拥有
mysql数据库的SELECT权限,只有root或其他管理员用户才有此权限。 - 密码是哈希值: 在
mysql.user表中,authentication_string字段存储的是密码的哈希值,而不是明文密码,这是出于安全考虑。 - 权限的层级: MySQL 的权限是分层的,一个用户可能拥有全局权限(
ON *.*),但同时又被授予了特定数据库的权限,后者会覆盖或补充前者。SHOW GRANTS命令会为你清晰地展示所有生效的权限。
