DESC 就是 DESCRIBE 的官方简写,两者完全等价;执行结果相同,均查询 information_schema.COLUMNS,返回 Field、Type、Null、Key、Default、Extra 六列元数据。

DESC 和 DESCRIBE 是一回事,别被缩写搞懵
直接说结论:DESC 就是 DESCRIBE 的官方简写,两者完全等价,没有任何功能差异。MySQL 从 3.x 版本起就支持这个快捷写法,不是某些客户端的私有扩展。
- 执行
DESC employees;和DESCRIBE employees;返回结果一模一样 - 如果误写成
describe当作字段名(比如建表时加了个叫describe的列),会报语法错误——因为DESCRIBE是保留关键字,必须用反引号包裹:`describe` - 它底层其实走的是对
information_schema.COLUMNS的查询,所以不依赖具体存储引擎,InnoDB、MyISAM 都能用
DESC 输出字段含义,每个都得看懂
运行 DESC 表名; 后返回六列:Field、Type、Null、Key、Default、Extra。这不是装饰,每一列都对应实际建表逻辑:
-
Field:字段名,注意大小写敏感性取决于系统变量lower_case_table_names,但字段名本身区分大小写(除非用反引号强制) -
Type:类型含精度,比如varchar(255)和varchar(1024)在索引长度限制上完全不同;int(11)的(11)仅影响显示宽度(ZEROFILL 时生效),和取值范围无关 -
Null:标YES不代表允许 NULL,而是“未声明 NOT NULL”;标NO才真正禁止 NULL 值 -
Key:PRI=主键,MUL=普通索引(或前导列在联合索引中),UNI=唯一索引;空值≠无索引,可能是没建索引,也可能是索引建在其他列上 -
Extra:重点盯AUTO_INCREMENT和GENERATED ALWAYS AS,前者说明是自增主键,后者说明是计算列,不能手动 INSERT
什么时候光靠 DESC 不够,得换命令
DESC 快、直观,但信息有限——它不显示外键约束、不显示分区定义、不显示全文索引、不显示字符集和排序规则,更看不到建表时用的 ENGINE。
- 要确认是否用了
utf8mb4还是过时的utf8?用SHOW CREATE TABLE 表名\G;(加\G让输出竖排,不然一行挤满看不清) - 想查某个字段是不是外键引用了别的表?
DESC完全不体现,得查information_schema.KEY_COLUMN_USAGE - 发现某列值总是 NULL,但
DESC显示Null: YES——这只能说明“没写 NOT NULL”,不能说明业务逻辑是否应该允许 NULL,得翻代码或文档 - 需要批量导出多个表结构做比对?
DESC每次只能查一个表,而SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='xxx'可一次拉全库字段元数据
容易忽略的细节:NULL、DEFAULT、Extra 的组合陷阱
这三个字段合起来,常常藏着隐性行为。比如你看到这样一行:
name | varchar(50) | YES | | NULL |
看起来很普通,但实际意味着:该字段可为 NULL,没有默认值,插入时不填就是 NULL —— 如果应用层没做判空,可能引发空指针或脏数据。
-
Null: YES+Default: NULL≠ 字段可为空就“安全”,很多 ORM 默认把 NULL 当缺失值处理,导致 UPDATE 时跳过该字段 -
Extra: auto_increment一定伴随Key: PRI,但反过来不成立:主键未必是自增(比如 UUID 主键) - 如果
Default显示为CURRENT_TIMESTAMP或CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,说明是时间戳自动更新,DESC不会告诉你触发时机细节,得看SHOW CREATE TABLE
真正用好 DESC,不是背熟字段名,而是把它当成一个起点——看到异常组合,立刻想到该去查哪张系统表、该补哪条 SHOW 命令、该翻哪段业务逻辑。










