Navicat 导入 JSON 时不会自动创建字段或推断类型,必须预先手动建表并显式声明 JSON 类型;若字段为 TEXT 则 JSON 函数失效,且 Navicat 旧版本或非 Premium 版本不支持 JSON 树形编辑。
Navicat 导入 JSON 时字段类型被自动设为 VARCHAR 或 TEXT
navicat 导入 json 文件时根本**不创建新字段**,也不推断或设置列类型——它只往已有表里填数据。所谓“字段类型不正确”,其实是你导入前没建好目标表,或建表时手动选了 varchar、text 而非 json 类型。
常见错误场景:
- 直接点「新建表」再导入 JSON:Navicat 会按第一行 key 的值类型草率生成列,
"id": 1→INT,"data": {"a":1}→TEXT(不是JSON) - 已有表但字段是
TEXT,导入后看似成功,但后续执行JSON_EXTRACT(data, "$.a")会返回NULL(因为 MySQL 不对TEXT做 JSON 校验和解析) - 用 Navicat「设计表」界面试图把
TEXT改成JSON:保存无反应,类型不变——这个操作完全无效
必须手动建表并显式声明 JSON 类型:
CREATE TABLE users ( id INT PRIMARY KEY, profile JSON );
目标列是 JSON 类型,但导入后 JSON_VALID() 返回 0
这说明数据本身不合法,而非 Navicat 改了类型。MySQL 的 JSON 列会对写入值做 RFC 7159 校验,失败则拒绝插入(报错)或静默转为 NULL(取决于 SQL mode)。
典型非法输入:
- JSON 字符串含单引号:
{'name': 'alice'}(必须双引号) - 尾部多余逗号:
{"id": 1, "name": "bob",} - 控制字符或 BOM 头:文件开头有
\uFEFF,导致整个字符串被判定为非法 - 数值溢出:超长整数(如 2^53+1)在 JS 序列化后失真,MySQL 解析失败
验证方法:在 Navicat 查询窗口执行
SELECT JSON_VALID('{"name": "alice"}') AS valid;
若返回 0,说明原始 JSON 字符串就有问题,需用 jq 或 Python 预处理修复。
导入后字段显示正常,但 Navicat 编辑器不弹出 JSON 树形视图
这和字段类型是否为 JSON 直接相关,但也受客户端版本限制:
- 确认字段类型:执行
SHOW COLUMNS FROM your_table LIKE 'data';,Type列必须是json(小写),不是text或空 - Navicat 版本要求:只有
Premium v15.0.28+及更高版本支持 JSON 字段的树形编辑;Standard或Essentials版本永远不显示 - 连接驱动问题:MySQL 8.0+ 默认认证插件为
caching_sha2_password,旧版 Navicat 驱动可能无法完成 JSON 字段所需的二进制协议协商,导致元数据读取失败
如果 Type 是 json 但依然不显示编辑器,优先升级 Navicat Premium 并检查连接高级设置中是否启用 allowPublicKeyRetrieval=true。
为什么导出 JSON 再导入,字段类型就丢了
Navicat 导出 JSON 时默认只执行 SELECT *,不查 information_schema.columns,所以导出文件里只有值,没有类型、长度、注释等元数据。再导入时,Navicat 只能靠值反推——"1" 推成 VARCHAR,1 推成 INT,{"a":1} 推成 TEXT。
想保留类型,必须绕过「导出向导」:
- 手写查询语句,显式 cast 和别名:
SELECT id, CAST(profile AS JSON) AS profile FROM users; - 导出格式选「SQL」而非「JSON」,用
INSERT INTO ... VALUES (...)语句,其中JSON_OBJECT()等函数可确保类型上下文 - Mac 用户特别注意:导出向导首屏默认勾选「导出数据」,一勾就跳过元数据,务必取消
真正关键的不是导入动作,而是你有没有提前建好带正确 JSON 类型的表结构——Navicat 从不帮你决定类型,它只忠实地往你指定的列里塞值。


















