DESC仅显示字段名、类型、NULL性、键、默认值和额外属性,不包含主键名、外键、CHECK约束、生成列表达式、字符集/排序规则及完整注释;完整结构须用SHOW CREATE TABLE;结构化元数据查询应使用INFORMATION_SCHEMA。

DESC 命令只能显示基础列信息,不返回完整定义
DESC(或 DESCRIBE)本质是 SHOW COLUMNS FROM 的快捷写法,它只输出字段名、类型、是否允许 NULL、键类型、默认值和额外属性(如 auto_increment),**不会显示主键约束名、外键定义、CHECK 约束、生成列表达式、字符集/排序规则细节,也不体现列注释的完整内容**。如果你看到 Default 列为空但实际有默认值,或者 Extra 里只有 auto_increment 却没看到 STORED/VIRTUAL 标识,这就是它能力边界所在。
想看完整建表语句,必须用 SHOW CREATE TABLE
真正还原表结构定义的唯一可靠方式是:SHOW CREATE TABLE table_name。它返回带换行缩进的原始 CREATE TABLE 语句,包含所有细节:
- 显式声明的
ENGINE、CHARSET、COLLATE - 每列的
COMMENT(DESC只在Field列末尾简略显示,且可能被截断) - 复合主键、唯一索引、外键约束的完整语法(包括
ON UPDATE CASCADE等) - 生成列的
AS (expr)表达式和存储类型 - 分区定义(如果存在)
注意:执行结果中 Create Table 字段值是纯文本,需手动复制;若表名含特殊字符,记得用反引号包裹,例如 SHOW CREATE TABLE `user-log`。
需要查约束或索引元数据?转向 INFORMATION_SCHEMA
当你要程序化获取约束名、引用表、更新规则等结构化信息时,SHOW CREATE TABLE 的文本解析太脆弱。INFORMATION_SCHEMA 才是标准接口:
- 查主键/唯一/外键约束:
SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'your_table' - 查 CHECK 约束:
SELECT * FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = DATABASE() - 查索引详情(含顺序、长度、排序方向):
SELECT * FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_NAME = 'your_table'
这些视图字段命名规范、支持 WHERE 过滤、可 JOIN,适合脚本调用或嵌入应用逻辑。但注意权限——用户必须有对 INFORMATION_SCHEMA 的 SELECT 权限,某些托管 MySQL 服务(如 AWS RDS)会限制部分视图访问。
DESC 在命令行里容易误读的几个坑
MySQL 客户端输出是表格格式,列宽自动截断,常导致关键信息丢失:
-
Type列可能把varchar(255)显示为varchar(255),但把decimal(18,2)截成decimal(18,2)—— 看似一样,实则没问题;但json类型可能被缩写成json,而geometry可能直接显示为geometry,无从判断 SRID -
Default列对显式指定DEFAULT NULL和隐式允许 NULL 不做区分,全为空;而DEFAULT CURRENT_TIMESTAMP可能只显示为CURRENT_TIMESTAMP,丢失ON UPDATE部分 - 使用
\G结尾(如DESC t\G)可转为竖排输出,避免截断,但依然不增加任何新字段
真正要确认一个字段是否“有默认值且非 NULL”,不能只信 DESC 的 Default 和 Null 两列,得回看 SHOW CREATE TABLE 的原始语句。


















