推荐用 describe table_name; 查表结构,它最常用轻量,等价于 show columns from table_name;,但不显示 comment;需看注释、隐藏字段或完整 ddl 时,应分别用 show full columns、show create table 或 information_schema.columns。

DESCRIBE 和 SHOW COLUMNS 都能看,但推荐用 DESCRIBE
直接在 MySQL 客户端执行 DESCRIBE table_name; 是最常用、最轻量的方式。它等价于 SHOW COLUMNS FROM table_name;,输出字段名、类型、是否允许 NULL、键信息、默认值和额外属性(如 auto_increment)。注意:表名区分大小写(取决于操作系统和 lower_case_table_names 设置),输错会报 ERROR 1146 (42S02): Table 'xxx' doesn't exist。
- 如果只关心字段类型和注释,加
EXTRA列可能被忽略——DESCRIBE不显示COMMENT,得用SHOW FULL COLUMNS FROM table_name; -
SHOW CREATE TABLE table_name;才能看到完整建表语句,包括引擎、字符集、索引、外键和字段注释,适合复制结构或排查 DDL 差异 - 别用
SELECT * FROM information_schema.COLUMNS WHERE TABLE_NAME = 'xxx';查单表结构——虽然灵活,但要手动过滤TABLE_SCHEMA,且结果列太多,干扰判断
information_schema 查询适合批量分析或跨库对比
当你要查多个表的字段数、是否有 JSON 类型、或者统计某库下所有带 NOT NULL 的字段时,information_schema.COLUMNS 就不可替代。但必须指定 TABLE_SCHEMA,否则可能查到系统库的同名表:
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'mydb' AND TABLE_NAME = 'users' ORDER BY ORDINAL_POSITION;
- 字段顺序靠
ORDINAL_POSITION,不是COLUMN_NAME字典序 -
COLUMN_COMMENT是字段注释,TABLE_COMMENT在information_schema.TABLES里 - 权限不足时查
information_schema可能返回空结果,而DESCRIBE只要对表有 SELECT 权就能用
Navicat / DBeaver 等 GUI 工具点出来的“结构”未必实时
很多 GUI 默认缓存元数据,尤其在你刚执行过 ALTER TABLE 后,右键“刷新”或关闭再打开表结构页才生效。更隐蔽的问题是:某些工具(如旧版 Navicat)对 GENERATED COLUMN 或 VIRTUAL 字段显示不全,甚至漏掉 STORED 属性。这时候必须回到命令行跑一遍 SHOW CREATE TABLE 对照。
- 遇到“字段明明改了类型,GUI 还显示 old_type”,先执行
FLUSH TABLES;(仅限有 SUPER 权限时)或直接重连会话 - MySQL 8.0+ 支持隐藏字段(
HIDDEN),DESCRIBE不显示,但SHOW CREATE TABLE会标出INVISIBLE
用 mysqldump --no-data 能导出结构,但不适合日常查看
mysqldump -d -u user -p mydb users 输出的是可执行的 SQL,适合备份或迁移,但作为“查看”手段太重:要输密码、启动新进程、还要过滤注释和分号。唯一实用场景是确认字符集/排序规则是否被显式声明(比如看到 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci),因为 SHOW CREATE TABLE 也会显示,但 dump 更贴近实际建表逻辑。
- 加
--skip-comments可去掉版本和时间戳注释,让输出干净些 - 若表有全文索引或空间字段,
mysqldump会包含 ENGINE 和 ROW_FORMAT,而DESCRIBE完全不体现这些
字段注释、生成列属性、隐藏状态、字符集继承关系——这些细节在不同命令间分布零散,光记一个 DESCRIBE 容易漏关键信息。










