SHOW GRANTS FOR 'username'@'host' 是查看用户完整权限的唯一可靠方法,它自动聚合全局、数据库、表、列及存储过程等所有层级权限;需确保用户名和 host 拼写完全匹配,否则报错或返回空。
直接查 mysql.user 表只能看到全局权限,不全
很多人在 phpmyadmin 里点开 mysql 数据库,打开 user 表,以为看到的 select_priv、insert_priv 等字段就是该用户的全部权限——其实不是。mysql.user 只存全局(server-level)权限,而数据库级、表级、列级、存储过程等权限分散在 mysql.db、mysql.tables_priv、mysql.columns_priv、mysql.procs_priv 等表中。漏掉这些,权限清单就是残缺的。
用 SHOW GRANTS FOR 'username'@'host' 最可靠
这是 MySQL 原生命令,在 phpMyAdmin 的「SQL」标签页中直接执行即可,它会自动聚合所有层级的权限并格式化输出。注意必须带单引号,且 host 部分要和用户实际定义一致(比如 'localhost'、'%' 或具体 IP):
SHOW GRANTS FOR 'myuser'@'localhost';
- 如果提示
ERROR 1141 (42000): There is no such grant defined for user ...,说明用户名或 host 拼写错误,或该用户根本不存在 - 返回结果每行是一条
GRANT语句,包含权限类型、作用对象(如ON `db1`.*)、WITH GRANT OPTION 等细节 - 不区分大小写,但反引号 `` ` `` 包裹的数据库/表名是原样保留的,注意是否含特殊字符或空格
查不到权限?先确认用户是否存在且拼写准确
SHOW GRANTS 报错或返回空,大概率是用户没找对。别依赖 phpMyAdmin 左侧导航栏显示的“用户”列表——那只是 mysql.user 表的视图,可能遗漏 host 不同的同名用户。用这条语句交叉验证:
SELECT User, Host FROM mysql.user WHERE User = 'myuser';
- 同一个
User值可能对应多个Host(如'myuser'@'localhost'和'myuser'@'%'),它们是完全独立的账号 - phpMyAdmin 的「用户账户」页面默认只显示
mysql.user表内容,不会自动合并其他权限表,也不能直观看出权限继承关系 - 如果用户是通过
CREATE USER创建但尚未授权,SHOW GRANTS会返回GRANT USAGE ON *.* TO ...,表示只有连接权,无任何操作权限
需要导出或比对?把 SHOW GRANTS 结果复制出来再处理
phpMyAdmin 执行 SHOW GRANTS 后,结果以表格形式展示,但每行是一整条 SQL,不方便直接筛选。点击结果右上角的「导出」按钮,选择「CSV」或「JSON」,能保留原始语句结构。注意:
- 导出的 CSV 中,每行 GRANT 语句会被当做一个字段,用双引号包裹,逗号在语句内不会被误解析
- 不要手动复制粘贴到 Excel 再分列——GRANT 语句里的逗号、空格、反引号容易破坏格式
- 若需脚本批量分析(比如检查哪些用户有
DROP权限),建议用命令行mysql -u root -p -e "SHOW GRANTS FOR 'x'@'y';"配合grep,比 phpMyAdmin 更可控
权限分散在多张系统表里,又受 host 匹配规则影响,靠翻表或目测基本不可靠。真正想看清楚一个用户到底能干什么,SHOW GRANTS FOR 是唯一兼顾完整性与可读性的方法——前提是用户名和 host 一个字符都不能错。
立即学习“PHP免费学习笔记(深入)”;



















