desc 表名仅显示field、type、null、key、default、extra六项基础字段信息,不包含注释、字符集、排序规则、存储引擎等元数据;完整结构须用show create table或查询information_schema.columns。

DESC 表名只能看字段基础信息,别指望它显示注释或字符集
用 DESC 或 DESCRIBE 查表结构最顺手,但它的输出非常精简:只列 Field、Type、Null、Key、Default、Extra 这六列。这意味着你完全看不到字段注释(COLUMN_COMMENT)、字符集(CHARACTER_SET_NAME)、校验规则(COLLATION_NAME),甚至不知道这张表用的是 InnoDB 还是 MyISAM。
常见错误现象:
- 执行
DESC user;后发现字段有中文注释但没显示出来 → 实际注释存在,只是DESC不返回 - 复制表结构到新库时漏掉
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4→ 新表默认引擎或字符集可能不一致,后续插入 emoji 或并发写入出问题
SHOW CREATE TABLE 是还原建表语句的唯一可靠方式
SHOW CREATE TABLE 返回的是可直接执行的完整 SQL,包含所有 DDL 细节:字段定义、主键/索引/外键、存储引擎、字符集、排序规则、表注释、字段注释(如果用了 COMMENT 子句)。
使用场景:
- 跨环境迁移表结构(开发 → 测试 → 生产)
- 排查“为什么这个字段不能存 emoji”——一眼看到是不是
utf8mb4 - 确认是否启用了
AUTO_INCREMENT、ON UPDATE CURRENT_TIMESTAMP等隐式行为
注意:SHOW CREATE TABLE 的结果中,表名和字段名会被自动加上反引号(`),这是为了兼容关键字或含特殊字符的标识符,不是 bug。
查注释和元数据必须走 information_schema.COLUMNS
当你要批量导出字段注释、生成接口文档、做数据治理扫描,或者写脚本判断某张表有没有某个带注释的字段时,DESC 和 SHOW CREATE TABLE 都不够用。必须查系统表:
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'your_db' AND TABLE_NAME = 'user';
关键点:
-
TABLE_SCHEMA是数据库名,不是当前库名,必须显式指定,否则可能查错库 -
COLUMN_COMMENT字段为空字符串('')≠ NULL,要写IS NULL OR COLUMN_COMMENT = ''才能准确过滤无注释字段 - 查询 performance 影响小,但频繁查大库的
information_schema可能触发 metadata lock,避免在高峰时段跑全库扫描
SHOW FULL COLUMNS FROM 表名 是折中方案,但容易被忽略
它比 DESC 多返回两列:Collation 和 Comment,刚好补上了字段注释和字符序信息,又比查 information_schema 简单,也不像 SHOW CREATE TABLE 那样需要解析 SQL 字符串。
适用情况:
- DBA 快速检查某张表字段是否有遗漏注释
- 运维写检查脚本,验证新建表是否按规范加了
COMMENT - 不想记长 SQL,又需要比
DESC多一点信息时的“懒人替代”
注意:SHOW FULL COLUMNS 不显示表级信息(如引擎、字符集),也不显示索引定义,这点和 SHOW CREATE TABLE 有本质区别。
DESC 里根本不存在,不是你没看清,是它压根不提供。选哪个命令,取决于你此刻要回答的问题——是“这个字段叫什么、是什么类型”,还是“我能不能直接拿这条 SQL 去另一个环境重建一模一样的表”,抑或“我要把所有带‘创建时间’注释的字段找出来”。











