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 的组合陷阱
这三个字段合起来,常常藏着隐性行为。比如你看到这样一行: