describe 在 mysql 中查询的是表字段的元数据基本信息,即字段名、类型、是否为空、键信息、默认值和额外属性,不包含注释、约束、索引详情、外键关系、字符集、排序规则等。

DESCRIBE 在 MySQL 里到底查的是什么
DESCRIBE 是 MySQL 的快捷命令,本质是 SHOW COLUMNS FROM 的别名,只返回字段名、类型、是否为空、键信息、默认值和额外属性。它不查注释、约束(如 CHECK)、索引详情或外键关系。
- 执行
DESCRIBE table_name时,MySQL 实际走的是元数据缓存,速度快但信息窄 - 字段
Type显示varchar(255)这类形式,但不会告诉你字符集或排序规则(COLLATION) - 如果表有列注释,
DESCRIBE完全不显示 —— 这是新手最常漏掉的关键信息 - 在 MySQL 8.0+ 中,
DESCRIBE对临时表、CTE 或派生表直接报错:ERROR 1146 (42S02): Table 'db.tmp' doesn't exist
INFORMATION_SCHEMA.TABLES 和 COLUMNS 怎么精准定位字段
真正要查结构细节,得直奔 INFORMATION_SCHEMA.COLUMNS。它字段全、可过滤、跨引擎一致,但要注意 schema 名必须显式指定,不能省略。
- 查某张表所有字段及注释:
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT<br>FROM INFORMATION_SCHEMA.COLUMNS<br>WHERE TABLE_SCHEMA = 'your_db'<br> AND TABLE_NAME = 'your_table'<br>ORDER BY ORDINAL_POSITION;
-
COLUMN_COMMENT是唯一能拿到列注释的地方;EXTRA字段包含auto_increment或on update CURRENT_TIMESTAMP这类修饰 - 注意
TABLE_SCHEMA区分大小写(尤其在 Linux 环境),写成'YOUR_DB'可能查不到结果 - 性能上,首次查询可能稍慢,因为要扫描系统视图;加
TABLE_SCHEMA+TABLE_NAME双条件能用上索引
为什么 SHOW CREATE TABLE 比 DESCRIBE 更实用
当你要还原建表逻辑、确认约束或排查 DDL 差异时,SHOW CREATE TABLE 是不可替代的。它输出的是完整可执行的 SQL,连字符集、存储引擎、分区定义都包含在内。
- 它能暴露
DESCRIBE完全不提的信息:主键是否是隐式创建、全文索引字段、生成列(GENERATED ALWAYS AS)表达式 - 外键定义在
CREATE TABLE结果里以CONSTRAINT `fk_name` FOREIGN KEY ...形式出现,而INFORMATION_SCHEMA.KEY_COLUMN_USAGE需要额外 JOIN 才能对齐 - 注意输出中的反引号 —— 如果表名含关键字(如
order),SHOW CREATE TABLE会自动加上,但你复制后直接执行可能因当前 SQL 模式报错 - 结果是单行大文本,用客户端工具查看时建议开启“自动换行”,否则容易漏看末尾的
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
PostgreSQL 或 SQL Server 用户别硬套 MySQL 写法
不同数据库的“查结构”命令完全不兼容。DESCRIBE 在 PostgreSQL 中不存在,在 SQL Server 中是 sp_help 的别名,行为也不同。
- PostgreSQL 用
\d table_name(psql 命令行)或查pg_attribute+pg_type系统表;column_default字段存的是内部表达式,不是直观值 - SQL Server 用
sp_help 'table_name'或SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('t');注意sys.columns不包含注释,得 JOINsys.extended_properties - 跨数据库写自动化脚本时,别依赖
DESCRIBE—— 它不是 SQL 标准,Oracle 用DESC(无RIBE),SQLite 用PRAGMA table_info(table) - 如果用 ORM 或迁移工具(如 Flyway、Liquibase),它们通常封装了方言适配,此时手写
INFORMATION_SCHEMA查询反而容易出兼容问题
实际查结构时,最常被跳过的其实是字符集和时区设置。比如 SHOW CREATE TABLE 末尾的 COLLATE utf8mb4_0900_as_cs,会影响大小写敏感比对;而 TIMESTAMP 字段是否带 ON UPDATE CURRENT_TIMESTAMP,得看 EXTRA 列,不是 COLUMN_DEFAULT。










