SQL

JSON 转 SQL

从 JSON 生成带类型的 MySQL、PostgreSQL 或 SQLite SQL

SQL 与数据库
🔒 100% 本地运行 — 你的数据不会离开当前页面
由 Evan 维护•最近更新:2026年9月30日
JSON → SQL

在浏览器内处理,不保存输入。输入最多 1 MiB、5,000 行、200 列、64 层嵌套,SQL 输出最多 4 MiB。超出安全整数范围或解析后十进制值改变的数字会报错;精确 ID、金额或高精度值请用字符串。

同列混合类型统一编码为 JSON:PostgreSQL 使用 JSONB,MySQL 使用 JSON,SQLite 使用 JSON 文本。缺失字段与 null 为 SQL NULL。推断不会创建主键、索引或业务约束;请先核对目标表。

SQL

点击生成后显示 SQL;编辑输入或设置会清除旧结果。

工具说明

JSON 转 SQL 将单个对象或非空对象数组转换为 MySQL、PostgreSQL 或 SQLite INSERT,并可选生成起始 CREATE TABLE。它只读取自身属性,对所有输入键取并集,缺失字段与显式 null 输出 SQL NULL。同列存在混合类型或嵌套值时,每个非 NULL 值都统一编码成 JSON:PostgreSQL 使用 JSONB,MySQL 使用 JSON,SQLite 使用 JSON 文本。同类型字符串、布尔值和安全数字使用对应起始类型。解析器会拒绝重复键、不安全整数、非有限数,以及在 JavaScript 数值转换后十进制值发生变化的数字。非整数 SQL 值采用近似浮点类型;精确 ID、金额和高精度值应使用字符串。输入最多 1 MiB、5,000 行、200 列、64 层嵌套,导出前检查名称、NUL 与 Unicode。所有处理在浏览器内完成,不保存输入或连接数据库;执行前请复核推断类型与目标表结构。 SQL 输出上限为 4 MiB;超限时请增加批量行数或减少输入。页面仅预览前 64 KiB,复制和下载包含通过上限检查后的完整结果。

场景配方

01

导入前核对混合 payload 的类型

目标:区分对象、字符串和缺失字段。

  1. 粘贴 [{"payload":{"x":1}},{"payload":"plain text"},{}],选择目标数据库,并把表名设为 events。
  2. 启用 CREATE TABLE,生成后检查 payload:PostgreSQL 为 JSONB,MySQL 为 JSON,SQLite 为 JSON 文本。
  3. 在临时数据库执行并读回三行:第一项是对象,第二项是 JSON 字符串,第三项是 SQL NULL;用于其他环境前再核对实际表结构。

结果:每列的非空混合值使用一致表示,缺失数据保持为 SQL NULL。

失败门诊(高频踩坑)

稀疏 JSON 展开后 SQL 很大

原因:每条记录都会包含所有已出现的列,较小批次还会重复列名列表。

修复:增加每条 INSERT 行数或减少数据。SQL 超过 4 MiB 会整体拒绝;即使预览止于 64 KiB,复制和下载仍包含通过检查的完整结果。

较大的 JSON 数字被拒绝

原因:超出 JavaScript 安全整数范围的数值、非有限值,以及解析后十进制值发生变化的数字无法可靠导出。

修复:精确 ID、金额和高精度值使用 JSON 字符串。受支持的非整数使用近似浮点 SQL 类型,不会自动推断 DECIMAL 精度。

不同源类型被统一成 JSON 列

原因:同一 SQL 列需要一致表示,例如 true 与 "word" 混合时,所有非 NULL 行都编码成 JSON。

修复:同时检查推断类型和生成值。需要其他字段类型时,应明确归一化源数据,或同时修改 schema 与值。

某个 JSON 键无法用作列名

原因:可移植名称子集拒绝空名、控制字符、两端空白、超过 63 个 UTF-8 字节的名称和仅大小写不同的列名;重复 JSON 键也会被拒绝。

修复:明确重命名冲突字段。名称内部的空格、引号、Unicode 和点号会作为一个列名引用;只有单独的表名输入框将点号解释为 schema.table。

生产可用片段

混合 JSON 列中的普通字符串也必须编码成 JSON 字符串

sql

-- 输入:[{"payload":{"x":1}},{"payload":"plain text"},{}]
-- 数据库:PostgreSQL;表名:events
CREATE TABLE "events" ("payload" JSONB);
INSERT INTO "events" ("payload") VALUES
  (E'{"x":1}'),
  (E'"plain text"'),
  (NULL);

-- plain text 外的双引号属于 JSON 值本身。
-- 缺失字段与显式 null 都输出 SQL NULL。

常见问题

同一列包含混合类型时如何表示?

混合类型或嵌套列中的每个非 NULL 值都编码成 JSON,普通字符串也会带上 JSON 所需的双引号。PostgreSQL 使用 JSONB,MySQL 使用 JSON,SQLite 使用保存 JSON 文本的 TEXT。

缺失字段和特殊键如何处理?

只读取自身属性。缺失 constructor 或 __proto__ 会输出 SQL NULL;明确存在的键会保留其值。显式 JSON null 同样输出 SQL NULL。

能把 9007199254740993 作为 JSON 数字转换吗?

不能,它超出 JavaScript 安全整数范围,解析时会取整。请用字符串 "9007199254740993"。会损失精度的小数和非有限数也会被拒绝;浮点 SQL 列本身采用近似表示。

允许哪些列名和表名?

列名为 1–63 个 UTF-8 字节,不含控制字符或两端空白,内部空格、引号、Unicode 与点号会按字面引用。重复 JSON 键和仅大小写不同的列名会被拒绝。表名输入框接受 ASCII table 或 schema.table。

CREATE TABLE 推断包含哪些内容?

只根据输入值建议字段类型,不推断主键、索引、外键、默认值或业务约束。关闭 CREATE TABLE 时,需要确认已有 schema 能接收生成的值。

工具会执行 SQL 或保留输入吗?

不会,只在浏览器本地生成文本,不连接数据库,也不保存输入。不支持 NUL 与未配对 Unicode 代理项;修改输入或设置会使旧输出失效。

继续浏览