Navicat仅支持扁平JSON数组格式(如[{"k":"v"}]),不解析单对象或嵌套结构;需预处理为合法数组、统一小写下划线字段名、确保UTF-8无BOM编码,并手动映射字段。
JSON 不是数组格式导致导入中断
navicat 的 json 导入功能只接受 [{"key":"value"}] 这种 array of objects 格式。如果你拖进去的是单个对象 {"id":1,"name":"alice"},它不会报明确错误,而是静默失败或只导入空行。
实操建议:
- 用
jsonlint.com或 VS Code 验证 JSON 是否为合法数组;不是就包一层:将{...}改成[{...}] - 嵌套结构如
{"data":[{"id":1}]}必须提前提取内层数组,Python 脚本示例:data = json.load(f)["data"] - Mac 用户注意:右键导出时默认是
Export Selected Rows as JSON,务必选Export All Rows as JSON,否则可能导出空数组[]
字段名大小写/空格不一致引发映射失效
Navicat 字段映射逻辑严格区分大小写和空白字符。MySQL 表本身可能不区分,但 Navicat 在「字段映射」步骤中左侧 key 和右侧列名必须完全一致才能自动关联。
常见现象:
- JSON 里是
"UserId",表中列为user_id→ 映射断开,值被丢弃 - JSON 里是
"Full Name"→ Navicat 可能忽略或转成full_name,但不保证可靠 - 第一行有
"status",第二行写成"Status"→ 第二行该字段直接为NULL
实操建议:
- 预处理统一小写下划线:用 Python 脚本批量替换
.replace("UserId", "user_id").replace("Full Name", "full_name") - 导入向导中别依赖自动匹配,手动拖拽左侧字段到右侧对应列
- 对含空格或特殊符号的 key,优先在 JSON 源头修正,而非指望 Navicat 自动清洗
日期/数字类型被导出为字符串却未适配目标列
Navicat 导出 JSON 时不做类型推断:TINYINT(1) 存布尔值,导出为 "1" 字符串;Unix 时间戳 INT 导出为 "1710512528" 字符串。若目标列为 TINYINT 或 DATETIME,直接导入会失败或变 NULL。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
实操建议:
- 检查目标列类型:若为
DATETIME,JSON 中对应字段必须是字符串且格式匹配「高级设置」中的yyyy-MM-dd HH:mm:ss等(不支持YYYY-MM-DDTHH:MM:SSZ) - 毫秒时间戳无法靠「日期时间格式」框解决,必须提前转成字符串日期,或改用 SQL 插入 +
FROM_UNIXTIME() - 布尔字段建议在 JSON 中显式写成
1/0数字,而非true/false,避免隐式转换风险
中文乱码与 BOM 导致解析失败
JSON 文件里明明有 "name": "张三",导入后变 "???" 或整行乱码,根本原因不是文件损坏,而是编码链断裂:JSON 文件自身编码 ≠ Navicat 连接字符集 ≠ MySQL 表字符集。
实操建议:
- 用 VS Code 打开 JSON 文件,确认右下角显示
UTF-8(不是UTF-8 with BOM);Windows 记事本另存为 UTF-8 默认带 BOM,Navicat 对其敏感 - Navicat 连接属性中
Character set必须设为utf8mb4,且与目标表CHARSET=utf8mb4一致 - MySQL 服务端执行
SHOW VARIABLES LIKE 'character_set%';,确保character_set_client、character_set_connection、character_set_database均为utf8mb4
嵌套超过两层(比如 address.city.zipcode)的 JSON,Navicat 17 基本无法映射——这不是设置问题,是能力边界。这种场景下,别在导入向导里硬扛,直接切 SQL 插入 + JSON_EXTRACT() 后处理更可控。










