Navicat导入JSON失败主因有四:①JSON必须为array of objects格式;②字段名须严格大小写/符号匹配;③日期格式仅对字符串型日期生效且需与目标列类型对应;④中文乱码需同时确保JSON文件UTF-8无BOM、连接设utf8mb4、表字符集为utf8mb4。
Navicat 导入 JSON 时字段映射不生效?先确认 JSON 结构类型
navicat 的 json 导入功能只支持两种结构:扁平的 array of objects(即 json 数组,每个元素是键值对对象),不支持单个 object、嵌套数组或混合结构。如果你拖进一个 {"name":"alice","age":30} 这样的单对象 json,它会报错或只导入一行空数据。
- ✅ 正确格式示例:
[{"id":1,"name":"Tom"},{"id":2,"name":"Jerry"}] - ❌ 错误格式示例:
{"data":[{"id":1}]}或{"users":[{"id":1}]}—— Navicat 不解析外层 key - 导入前用在线工具(如 jsonlint.com)验证是否为合法数组;不是的话,先用 Python/Node.js 脚本提取出内层数组再保存
字段映射界面里找不到目标字段?检查表结构与 JSON key 是否严格匹配
Navicat 在「字段映射」步骤中,左侧显示的是 JSON 的 key 名(自动从第一行对象提取),右侧是目标表的列名。两者必须**大小写一致、无空格、无特殊字符**才能默认关联。MySQL 表默认不区分大小写,但 Navicat 映射逻辑区分。
- 若 JSON 中是
"user_name",而表中列为username,不会自动匹配,需手动拖拽或下拉选择 - 如果 JSON key 含空格(如
"full name"),Navicat 会转成full_name或直接忽略——建议预处理 JSON,用脚本统一替换.replace(/ /g, "_") - 目标列类型为
TINYINT或ENUM时,JSON 对应值必须是数字或枚举字面量(如"active"),不能是true或"1"(除非字段允许隐式转换)
“高级设置”里的“日期时间格式”填什么才有效?
这个输入框只影响 JSON 中字符串类型的日期字段(如 "created_at": "2024-03-15 14:22:08"),且仅当目标列为 DATETIME 或 TIMESTAMP 时起作用。填错格式会导致该字段全为 NULL 或导入中断。
- 常用格式字符串(注意大小写和符号):
yyyy-MM-dd HH:mm:ss、yyyy/MM/dd HH:mm:ss、MM/dd/yyyy HH:mm - 不支持
YYYY-MM-DDTHH:MM:SSZ这类 ISO 8601 变体(除非去掉T和Z) - 如果 JSON 里是毫秒时间戳(如
1710512528000),这里填任何格式都无效——必须提前在 JSON 中转成字符串日期,或改用 SQL 插入 +FROM_UNIXTIME()
导入后数据乱码或中文变问号?别只调 Navicat 字符集
Navicat 界面字符集设成 UTF8 不等于连接和表也用了 UTF8。真正起作用的是三处:Navicat 连接属性里的「字符集」、目标表的 CHARACTER SET、以及 JSON 文件本身的编码。
- 检查文件编码:用 VS Code 或 Notepad++ 打开 JSON,确认右下角显示
UTF-8(不是UTF-8 with BOM,BOM 会导致首条记录解析失败) - 连接设置中「高级」页签下,
MySQL Server charset必须设为utf8mb4(不是utf8) - 执行
SHOW CREATE TABLE your_table;,确认DEFAULT CHARSET=utf8mb4且各文本字段为utf8mb4_unicode_ci
字段映射看着对了,但 JSON 文件带 BOM、连接没设 utf8mb4、表用 latin1 —— 三个地方漏一个,中文就变


















