不能。mysql 8.0+ 禁止用 describe 查询 _mysql 系统库表,因其为内部内存表、不暴露列定义;可用 select ... from information_schema.columns where table_schema='mysql' and table_name='user' 替代。

DESCRIBE 能不能直接查 _mysql 系统库的表?
不能。MySQL 8.0+ 默认禁止用 DESCRIBE(或 SHOW COLUMNS)访问 _mysql 库下的表,哪怕你有 SELECT 权限,也会报错:Access denied; you need (at least one of) the SYSTEM_VARIABLES_ADMIN privilege(s) for this operation。这不是权限没给够,而是 MySQL 对系统元数据表做了硬性隔离——DESCRIBE 本质是语法糖,底层走的是 INFORMATION_SCHEMA 查询路径,而 _mysql 是内部内存表,不暴露列定义。
想快速看 _mysql.user 表结构,该用什么替代方案?
用 SELECT 查 INFORMATION_SCHEMA.COLUMNS,但得绕过 _mysql ——它根本不在该视图里。真正能反映运行时系统表结构的是 performance_schema 或直接查官方文档。更务实的做法是:
- 查 MySQL 官方手册对应版本页,比如 MySQL 8.0 mysql system schema,里面明确列出
user表字段、类型、默认值 - 用
mysqld --verbose --help | grep -A 10 "user table"(仅限本地调试,非运行时) - 如果只是验证字段是否存在,可尝试
SELECT * FROM mysql.user LIMIT 0,它会返回空结果集但带列头(需有 SELECT 权限),这是最接近“快速获取”的实际手段
为什么 DESCRIBE user 和 DESCRIBE mysql.user 结果不一样?
因为没指定库名时,DESCRIBE user 查的是当前默认数据库里的 user 表,不是系统库;而 DESCRIBE mysql.user 才指向系统表,但依然会失败(同上)。关键点在于:
-
DESCRIBE不支持跨库解析系统库表,即使写全名 -
mysql库本身是系统库,但它的表(如user)在 MySQL 8.0+ 已转为数据字典表,结构由 server 内部管理,不通过传统 .frm 文件暴露 - 真正可用的元数据入口只有
INFORMATION_SCHEMA(对普通表)和performance_schema(对部分运行时结构),_mysql是纯内部命名空间,不参与标准元数据查询链路
有没有一行命令能打印 mysql.user 字段名和类型?
有,但得放弃 DESCRIBE,改用 SELECT + INFORMATION_SCHEMA 查 mysql 库(注意:不是 _mysql):
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME = 'user' ORDER BY ORDINAL_POSITION;
这个能跑通,前提是用户有对 INFORMATION_SCHEMA 的 SELECT 权限(通常都有)。但要注意:mysql.user 在 8.0+ 字段比 5.7 少很多(比如没了 Password,改用 authentication_string),字段类型也更严格(如 account_locked 是 ENUM)。别照着老教程字段名硬写 SQL。
真正容易被忽略的是:_mysql 是 MySQL 8.4+ 引入的新内部 schema,用于存储服务端变量等轻量元数据,它压根不提供列定义接口,连 SELECT * FROM _mysql.xxx 都不支持,更别说 DESCRIBE。别在这上面浪费时间试权限或改配置。










