Navicat导出JSON为空的主因是默认只导当前页或选中行,需全选数据表格后导出;其次为WHERE条件错误、权限不足、导出设置勾选“仅导出结构”或“忽略空值”,以及缓存异常。
导出JSON时结果为空但SQL能查出数据
navicat 导出 json 为空,最常见原因是它默认只导出「当前页」或「选中行」,而不是整个查询结果集。即使你写了 select * from users,如果没手动点「全部选中」或没关掉分页限制,导出的 json 就是空数组 [] 或只有几条。
实操建议:
- 执行查询后,先按
Ctrl+A(Windows)或Cmd+A(macOS)全选结果表格——注意不是选 SQL 窗口,是下方数据表格区域 - 右键导出 → 选择「Export Selected Rows as JSON」而非「Export All Rows as JSON」时要格外小心:前者依赖手动选中,后者才真正跑完整查询
- 检查 Navicat 底部状态栏,看是否显示「Showing 1 to 20 of 124 rows」这类提示;如果显示「0 rows」但你知道表里有数据,大概率是过滤条件写错了或没点「Run」重执行
WHERE 条件写错导致 JSON 导出为空
在 SQL 编辑器里写了带 WHERE 的语句,但导出 JSON 是空的,大概率是条件值不匹配,比如大小写、空格、时区或字符串引号问题。
常见错误现象:
-
WHERE name = 'John'导出为空,但数据库里存的是'john'(小写)或' John '(带空格) -
WHERE created_at > '2024-01-01'没结果,实际字段是DATETIME类型,但 Navicat 默认显示日期不含时间部分,容易误判范围 - 用了中文引号「」或全角符号,SQL 直接报错或静默失败(Navicat 有时不弹错误框,只返回空)
实操建议:
- 先导出为 CSV 或文本,确认原始数据内容和格式,再回头调条件
- 用
LIKE替代=快速验证:例如WHERE name LIKE '%ohn%' - 对时间字段,优先用
BETWEEN或显式转成字符串比较:DATE(created_at) = '2024-01-01'
用户权限不足导致 SELECT 返回空结果集
Navicat 连接成功不代表能读取数据。如果账号被限制了表级或列级权限,SELECT 可能不报错,但返回空结果——导出 JSON 自然也是空。
使用场景:
- 连接的是生产库,DBA 给的账号只开放了
information_schema或特定视图 - 表名拼写正确,但实际访问的是另一个 schema(比如连的是
test库,但数据在prod库),而当前用户在test下对该表无权限 - 触发了行级安全策略(RLS),比如 PostgreSQL 的
ROW SECURITY POLICY,或 MySQL 8.0+ 的CREATE POLICY
实操建议:
- 在 SQL 窗口执行
SELECT COUNT(*) FROM your_table;,看返回是不是0;如果是,基本可锁定权限或 schema 问题 - 运行
SELECT CURRENT_USER(), DATABASE();确认当前身份和默认库 - 换一个已知有全量权限的账号试一次,快速排除权限干扰
导出设置里勾选了「仅导出结构」或「忽略空值」
Navicat 的 JSON 导出对话框里有两个关键开关容易被忽略:一个是「Export structure only」,另一个是「Skip empty values」。前者导出的是字段名列表,后者会把 NULL 字段整行过滤掉,极端情况下导致所有行都被跳过。
性能 / 兼容性影响:
- 勾选「Skip empty values」后,如果表里大量字段允许
NULL且当前页恰好全为NULL,就会导出空数组 - 某些旧版 Navicat(如 v15 以下)对 JSON 字段类型识别不稳定,可能把
JSON列当成TEXT处理并截断
实操建议:
- 导出前务必展开「Advanced Options」面板,检查这两个选项是否关闭
- 如果目标字段本身就是
JSON类型(如 MySQL 5.7+),建议先用CAST(col AS CHAR)包一层再导出,避免解析异常 - 导出后用文本编辑器打开 JSON 文件,搜
"data"或"rows"看结构是否符合预期;空文件里如果只有{}或[],基本就是设置或权限问题
最麻烦的情况是:SQL 能查、权限也够、设置都对,但导出仍为空——这时候得怀疑 Navicat 缓存或连接复用机制出了问题。重启软件、新建连接、甚至换一个版本(比如从 v16 切到 v17)往往比调参数更快。










