MySQL SHOW CREATE TABLE 和 INFORMATION_SCHEMA 为什么看到的属性不同
遇到“表结构明明一样,两个查询看到的属性却不同”,先不要把它当成数据库元数据冲突。SHOW CREATE TABLE 面向的是“怎样重新创建这张表”的完整定义;INFORMATION_SCHEMA 面向的是“怎样按字段、表名和属性筛选元数据”。同一张表用两种入口读取,展示口径自然不同。
官方地址:https://dev.mysql.com/doc/refman/8.4/en/show-create-table.html
简单记忆:要复制或审阅建表语句,先看 SHOW CREATE TABLE;要批量找列、默认值、字符集或注释,优先查询 INFORMATION_SCHEMA。下面按这个选择顺序拆开说明。
先判断:你要的是建表定义,还是可筛选元数据
这两个入口不是同一份结果换了格式。SHOW CREATE TABLE 返回一条重建表所需的 CREATE TABLE 定义,适合迁移前审阅、生成变更脚本和确认表级选项;INFORMATION_SCHEMA 是一组可以使用 WHERE、ORDER BY 和聚合的系统视图,适合做批量盘点。
| 目标 | 优先入口 | 原因 |
|---|---|---|
| 复现一张表 | SHOW CREATE TABLE | 结果直接呈现建表语句和表级选项 |
| 筛选多个库的列 | INFORMATION_SCHEMA.COLUMNS | 字段可用于条件、排序和批量导出 |
| 核对约束和索引 | 两者配合 | 一个看定义文本,一个看结构化元数据 |
用 SHOW CREATE TABLE 读取可复现的表定义
需要完整上下文时,先读取目标表的建表语句。执行账号需要对目标表拥有某种权限;结果中表名和列名的引号形式还会受到 sql_quote_show_create 会话选项影响。
-- 读取一张表的完整定义,适合复制前审阅 SHOW CREATE TABLE app.orders; -- 用竖排输出,便于在命令行中查看很长的 CREATE TABLE SHOW CREATE TABLE app.orders\G;
这里的“完整”是建表语句视角,不代表每个属性都会以你熟悉的原始写法出现。例如,MySQL 8.4 会把列定义中的 CHECK 约束按表约束形式显示;这通常是规范化展示,不等于约束消失。
还要留意两个容易误判的边界:生成的不可见主键默认也可能出现在建表定义中;表经历存储引擎变更后,某些不适用于新引擎的旧选项仍可能保留在定义里,便于回退。因此,看到 ROW_FORMAT 或隐藏主键时,不要直接拿它和运行时状态字段逐字比较。

用 INFORMATION_SCHEMA.COLUMNS 做可筛选的列级核对
INFORMATION_SCHEMA.COLUMNS 提供列名、序号、默认值、是否可为空、数据类型、字符集、排序规则和注释等结构化字段。它适合一次检查多个表,但查询时要明确限定 TABLE_SCHEMA,避免只靠表名撞到同名表。
-- 按定义顺序读取指定表的关键列属性
SELECT
TABLE_SCHEMA,
TABLE_NAME,
ORDINAL_POSITION,
COLUMN_NAME,
COLUMN_DEFAULT,
IS_NULLABLE,
DATA_TYPE,
CHARACTER_SET_NAME,
COLLATION_NAME,
COLUMN_COMMENT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'app'
AND TABLE_NAME = 'orders'
ORDER BY ORDINAL_POSITION;
这里有一个关键差异:从 COLUMNS 查询时不会自动按列定义顺序返回,必须显式 ORDER BY ORDINAL_POSITION。而 SHOW COLUMNS 的展示还可能把多个 COLUMNS 字段组合成一个 Type 文本,所以不能简单地按列数或字符串是否相同判断两份结果一致。
如果只想盘点所有业务表的字符集,可以换成批量条件;这也是 INFORMATION_SCHEMA 比建表语句更适合审计清单的地方:
-- 批量找出 app 库中使用指定字符集的字符列 SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'app' AND CHARACTER_SET_NAME = 'utf8mb4' ORDER BY TABLE_NAME, ORDINAL_POSITION;
为什么两边看到的属性会不一样
第一类差异来自信息粒度。SHOW CREATE TABLE 把列、约束、索引、引擎、字符集等组合成一段可执行定义;COLUMNS 只关心列级字段,表级选项要去看 INFORMATION_SCHEMA.TABLES,约束则要看对应的约束表。
第二类差异来自规范化。列上的 CHECK 约束在 SHOW CREATE TABLE 中可能按表约束呈现;默认值、字符集和排序规则则可能分别散落在 COLUMN_DEFAULT、CHARACTER_SET_NAME 和 COLLATION_NAME。一边是可执行文本,一边是拆开的字段,不同并不等于矛盾。
第三类差异来自隐藏对象和开关。生成的不可见主键默认可在建表语句和信息架构中显示,也可通过 show_gipk_in_create_table_and_information_schema 关闭这类信息。对同一环境做核对时,应把相关会话设置一起记录。

按任务收尾:复现、批量审计和迁移核对分别怎么做
如果目标是复现表,保存 SHOW CREATE TABLE 的结果,同时记录 MySQL 版本、相关会话选项和目标库名。不要把 INFORMATION_SCHEMA.COLUMNS 的几行结果拼回一条建表语句,因为它不覆盖所有表级信息。
如果目标是批量审计,查询 COLUMNS、TABLES 和约束相关信息,并统一使用明确的库名、表名和排序字段。这样得到的结果更适合导出、比较和后续脚本处理。
如果目标是迁移前后核对,先用 SHOW CREATE TABLE 确认定义,再用 INFORMATION_SCHEMA 按列输出差异。看到默认值、排序规则或隐藏列不同,先核对展示开关和版本,再决定是否需要进一步检查实际数据。
- 需要一条可以重放的定义:选择
SHOW CREATE TABLE。 - 需要跨多个表筛选属性:选择
INFORMATION_SCHEMA,并显式排序。 - 需要解释差异:按列级、表级、约束级和会话开关分层核对。
相关问题
为什么 INFORMATION_SCHEMA.COLUMNS 的列顺序和 SHOW COLUMNS 不一样?
SELECT 查询系统表时不会自动承诺按定义顺序返回,所以要使用 ORDER BY ORDINAL_POSITION。排序后再比较,才不会把返回顺序差异误判为结构差异。
SHOW CREATE TABLE 为什么出现我没有写过的 CHECK 约束形式?
MySQL 可以把列约束按表约束形式展示。判断约束是否存在时,应关注约束表达式和名称,不要只比较它在建表语句中的排版位置。
只看 INFORMATION_SCHEMA 能不能生成完整建表脚本?
不建议。它适合按字段查询元数据,但完整脚本还涉及索引、约束、引擎和表级选项;需要复现时直接保存 SHOW CREATE TABLE 的结果更稳妥。
MySQL CHECKSUM TABLE 怎样比较两张表的数据摘要
- 上一篇
- MySQL CHECKSUM TABLE 怎样比较两张表的数据摘要
- 下一篇
- MySQL 窗口函数共享排序的 WINDOW 子句写法
-
- 数据库 · MySQL | 1小时前 |
- MySQL 不同字符集列的索引长度参数对比
- 118浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL Performance Schema 按线程聚合等待事件
- 306浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL 事务隔离级别与锁定读的组合方案
- 271浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL 默认表达式与生成列的迁移清单
- 368浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL sys.schema_table_statistics_with_buffer 怎样定位表级 IO
- 335浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL INFORMATION_SCHEMA.TABLES 怎样区分表大小与索引大小
- 175浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL CHECK TABLE 怎样判断表结构与索引是否正常
- 374浏览 收藏
-
- 数据库 · MySQL | 2小时前 |
- MySQL 分区表的分区裁剪条件设计
- 154浏览 收藏
-
- 数据库 · MySQL | 2小时前 |
- MySQL LAG 与 LAST_VALUE 窗口帧的结果边界
- 432浏览 收藏
-
- 数据库 · MySQL | 2小时前 |
- MySQL 窗口函数共享排序的 WINDOW 子句写法
- 232浏览 收藏
-
- 数据库 · MySQL | 2小时前 |
- MySQL CHECKSUM TABLE 怎样比较两张表的数据摘要
- 233浏览 收藏
-
- 数据库 · MySQL | 2小时前 |
- MySQL 8.4 ANALYZE TABLE 直方图的桶数量配置方法
- 417浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 816次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 807次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 899次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 870次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 693次使用
-
- MySQL JSON_TABLE 展开数组时如何保留缺失字段
- 2026-09-10 501浏览
-
- MySQL 分区表怎么处理跨分区唯一键:分区列约束与建表取舍
- 2026-08-30 501浏览
-
- MySQL权限管理设置全攻略
- 2026-03-29 501浏览
-
- MySQL分片实现方法及常见方案解析
- 2025-06-24 501浏览
-
- MySQL表空间碎片怎么清理?超详细优化教程
- 2025-06-13 501浏览

