show create table是唯一能一次性获取完整建表语句的方式,包含字段定义、主键、索引、外键、字符集、排序规则、存储引擎、字段与表注释、生成列及隐藏字段等全部信息;加\g可优化长语句显示。

直接看建表语句:用 SHOW CREATE TABLE
这是唯一能一次性拿到完整结构的方式,包括字段定义、主键、索引、外键、字符集、排序规则、存储引擎、字段注释(COLUMN_COMMENT)、表注释(COMMENT),甚至生成列(GENERATED ALWAYS AS)和隐藏字段(HIDDEN)。
执行时加 \G 能避免长 SQL 换行混乱:
SHOW CREATE TABLE users\G
- 不加
\G时,输出是单行文本,容易被截断或难以阅读 - 如果表用了分区、压缩、页压缩(
page_compressed=1)等高级特性,只有SHOW CREATE TABLE会体现 -
DESCRIBE和SHOW COLUMNS都不会显示COMMENT,而这个字段在文档和 ORM 映射中很关键
查字段元数据:走 information_schema.COLUMNS
当你需要程序化获取字段信息(比如写迁移脚本、生成文档、做字段审计),必须查 information_schema.COLUMNS,但要注意过滤条件不能漏:
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT, ORDINAL_POSITION FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'mydb' AND TABLE_NAME = 'users' ORDER BY ORDINAL_POSITION;
- 必须指定
TABLE_SCHEMA,否则可能查到mysql或performance_schema里的同名表 - 用
ORDINAL_POSITION排序,不是COLUMN_NAME字典序——字段顺序对某些 ORM 或导出逻辑很重要 -
COLUMN_COMMENT是字段注释,IS_NULLABLE是 NOT NULL 状态,这些在DESCRIBE里看不到 - 权限不足时,这个查询可能返回空结果;而
DESCRIBE只要对表有SELECT权就能执行
快速核对字段:优先用 DESCRIBE,但别信它全
DESCRIBE users(或简写 DESC users)响应最快,适合终端里随手一查,但它只覆盖最基础字段信息:
- 不显示字段注释、字符集、排序规则、生成列逻辑、隐藏字段
- 对视图(
VIEW)也返回结果,但只是“投影列”,看不出底层 JOIN 或计算逻辑 - MySQL 8.0+ 的
HIDDEN字段完全不会出现在DESCRIBE输出里,但SHOW CREATE TABLE会明确标出HIDDEN - GUI 工具(如 DBeaver)的“结构”页常缓存元数据,刚
ALTER TABLE后可能仍显示旧结构,此时必须用SHOW CREATE TABLE对照
别踩这些坑
很多问题其实不是命令不会用,而是没意识到上下文限制:
- 表名大小写敏感取决于
lower_case_table_names设置和操作系统,Linux 下输错大小写直接报ERROR 1146 (42S02) -
SHOW FULL COLUMNS FROM users比DESCRIBE多出Collation和Privileges列,排查乱码或权限问题时有用,但日常没必要默认加FULL - 用
mysqlshow -u root -p mydb users查列名可以,但无法看到注释、默认值表达式(如CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)或约束细节 - 如果
SHOW CREATE TABLE输出里字段类型是json,注意 MySQL 5.7+ 才原生支持,低版本可能是LONGTEXT+ 应用层校验
真正完整的结构,永远以 SHOW CREATE TABLE 为准。其他方式都是按需裁剪的快照,用前得清楚它缺什么。











