mysql 8.0+ 推荐用 mysqlpump --skip-data --compact 导出标准json结构,最稳定;次选用 information_schema + json_object 聚合,但需显式处理生成列、排序规则等关键字段。

mysql如何查看表结构定义的JSON
MySQL 8.0+ 原生支持用 SHOW CREATE TABLE 或 INFORMATION_SCHEMA 拼 JSON,但真要“自动化运维”里稳定产出标准 JSON,别硬套 SELECT JSON_OBJECT(...) 手动拼——字段顺序、NULL 处理、类型映射全得自己兜底,一升级就崩。
用 mysqlpump 导出带结构的 JSON(最稳)
mysqlpump 是 MySQL 官方工具,8.0.16+ 默认自带,专为结构导出优化,加 --skip-data --compact --result-file 就能干净输出含表定义的 JSON 片段,不依赖客户端解析逻辑。
- 执行命令:
mysqlpump --skip-data --compact --result-file=table_def.json -u root -p db_name table_name - 输出里会包含
"createTableStatement"字段,值是完整CREATE TABLE语句,可直接用json_decode提取后二次解析 - 注意:默认不格式化 JSON,加
--set-gtid-purged=OFF避免 GTID 相关字段干扰结构体 - 老版本没
mysqlpump?别用mysqldump --no-data,它输出 SQL 文本,不是 JSON,强转易丢注释和字符集细节
用 INFORMATION_SCHEMA + JSON_OBJECT AGG 拼结构(需 8.0.13+)
如果必须在 SQL 层直接出 JSON,INFORMATION_SCHEMA.COLUMNS 是唯一可靠来源,但直接 JSON_OBJECT 会漏默认值、生成列、自增属性等关键字段。
- 关键字段必须显式查:
COLUMN_NAME、DATA_TYPE、IS_NULLABLE、COLUMN_DEFAULT、EXTRA、COLUMN_COMMENT - 别忽略
GENERATION_EXPRESSION(生成列)和COLLATION_NAME(排序规则),否则建表还原失败 - 示例片段:
SELECT JSON_OBJECT('table', 't1', 'columns', JSON_ARRAYAGG(JSON_OBJECT('name', COLUMN_NAME, 'type', DATA_TYPE, 'nullable', IS_NULLABLE))) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1' AND TABLE_SCHEMA = 'db' - 性能注意:大库查
INFORMATION_SCHEMA可能锁表或慢,加WHERE条件务必带上TABLE_SCHEMA和TABLE_NAME索引字段
自动化脚本里怎么接这个 JSON(Python 示例)
拿到 JSON 后,别直接当字典用——MySQL 的 COLUMN_DEFAULT 返回的是字符串 "NULL" 还是真正的 NULL,取决于字段是否允许 NULL,脚本里不判断就会错判默认值。
- 用
json.loads()后,检查每个字段的"is_nullable"是否为"YES",再决定"default"字段是否有效 - 字段类型映射要小心:
"tinyint(1)"往往是布尔逻辑,"datetime"和"timestamp"时区行为不同,自动化建表时得分开处理 - 路径别写死:
data['columns'][0]['name']这种写法扛不住空表,先if 'columns' in data and data['columns']再取 - 错误信息如
"Unknown column 'xxx' in 'field list'"多半是 JSON 解析时字段名大小写不一致,MySQL 表名默认小写,但字段名大小写敏感取决于lower_case_table_names设置
真正卡住自动化的地方,从来不是“怎么吐 JSON”,而是字段元数据里那些隐式规则——比如 TINYINT 和 BOOLEAN 在协议层是一回事,但运维脚本里要不要自动转成布尔类型,得看下游系统认不认。这种细节不提前对齐,JSON 再标准也没用。











