mysqlmysql如何查看表结构_mysql describe语法说明

来源:这里教程网 时间:2026-02-28 20:46:29 作者:

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
命令、该翻哪段业务逻辑。

相关推荐