Navicat导出JSON时字段类型和注释丢失,是因为默认执行SELECT *查询,未读取information_schema.columns中的column_type、column_comment等元数据,需手动改用元数据查询语句导出。
导出JSON时字段类型和注释丢失,是因为没走元数据查询路径
navicat 导出 json 默认执行的是 select * 查询,只拿到运行时数据值,不读取 information_schema.columns 里的 column_type、column_comment、extra 等元数据。所以你看到的 excel 或 html 文档里“类型”列为空、“注释”列消失,并不是导出失败,而是根本没去查这些字段。
常见表现包括:varchar(255) 变成空或 “text”,TINYINT(1) 被当成普通数字导出(值为 "1" 而非 true),datetime(3) 的毫秒精度被截断。
- 想保留类型和注释?必须手动改用元数据查询语句导出,不能依赖「导出向导」默认模式
- Mac 版尤其容易忽略:导出向导首屏默认勾选「导出数据」,这个选项一开就绕过元数据,直接跳进值提取流程
- MySQL 8.0+ 的
json类型字段在导出 JSON 时会被转成字符串,不是原生 JSON 对象——因为 Navicat 没调用JSON_EXTRACT或类型感知序列化
字段名大小写/下划线不一致导致映射断裂
Navicat 在导入或导出 JSON 时,会以第一条记录的 key 为 schema 样本,后续所有对象若出现同义不同形的字段(如 UserId、user_id、USERID),就会静默丢弃该字段值,不会报错也不会警告。
导出时也一样:如果你数据库字段是 created_at,但某条记录里误写了 createdAt,Navicat 会把它当新字段处理,可能导出为 {"created_at":"2024-01-01","createdAt":"2024-01-02"},但下游解析器只认标准命名,等于白导。
- 导出前建议统一清洗字段名:用 SQL 的
RENAME COLUMN或查询时显式别名,例如SELECT id AS user_id, name AS full_name FROM users - 避免依赖自动推导:Navicat 不支持字段别名映射回原始定义,一旦用了
AS,导出 JSON 就按别名来,不会反查原字段注释 - 中文字段名(如
用户ID)在导出 JSON 后可能被 URL 编码或乱码,尤其未设SET NAMES utf8mb4时
导出设置漏勾「使用双引号包裹字段名」导致 JSON 非法
Mac 版 Navicat 17 默认不启用 使用双引号包裹字段名,导出结果形如 {id:1,name:"张三"}——这在 JavaScript 中合法,但不符合 JSON 规范,任何标准解析器(JSON.parse()、json.loads())都会抛 SyntaxError: Unexpected token。
这个选项藏在「导出向导」→「JSON格式选项」最底部,字体小、无视觉强调,Mac 用户极易跳过。
- 务必手动勾选该选项,否则导出的文件根本不能被程序加载
- 导出路径含中文或空格(如
/Users/张三/navicat export/)也可能触发编码异常,导致字段名被截断或乱码 - 别点「导出表结构」:一旦勾选,输出开头混入
CREATE TABLE语句,整个文件不再是 JSON,解析必然失败
嵌套结构、数组字段在导出时被扁平化或丢弃
Navicat 17 不支持导出嵌套 JSON 字段的原生结构。比如 MySQL 表中有个 meta JSON 字段存 {"user":{"name":"tom","age":30}},导出 JSON 时它不会保持这个嵌套,而是转成字符串 "{\"user\":{\"name\":\"tom\",\"age\":30}}",或者更糟——直接丢掉引号变成非法内容。
更隐蔽的问题是:如果某行 meta 是 null,而另一行是完整对象,Navicat 会以第一个非空行为模板,后续 null 值可能被跳过,或导出为 "null" 字符串而非 JSON null 值。
- 导出前可先用 MySQL 的
JSON_EXTRACT拆解关键字段:例如SELECT id, JSON_EXTRACT(meta, '$.user.name') AS user_name, ... - 对含数组的 JSON 字段(如
tags存["a","b"]),Navicat 无法展开,只能整体导出为字符串;需要的话得用JSON_TABLE(MySQL 8.0.4+)先展开再导出 - 大表导出 JSON 时,Navicat 不流式写入,内存爆满可能导致中间截断——此时文件末尾缺失
]或},看起来像“部分字段丢失”,其实是文件损坏











