JSON / CSV 转 INSERT

从数据批量生成插入语句,表名列映射、方言转义与每批行数可调。

输入认六种形态:JSON 对象数组、{"id":[1,2],"name":[…]} 的「列→数组」列存写法、单个对象、数组的数组、基本值数组,以及 CSV/TSV,按 MySQL、PostgreSQL、SQL Server、Oracle、SQLite 五种方言之一拼成 INSERT。拼语句全程在浏览器内存里完成,不发请求、不连接数据库。

输出是转义后的字面量语句,没有做参数化。每批行数与空值口径都对着服务端的硬约束走,超限的批大小由工具强制截断;冲突处理只在 MySQL 与 PostgreSQL/SQLite 里生成,SQL Server 与 Oracle 要用 MERGE,本工具不生成,只输出普通 INSERT。数据里的 16 位以上裸数字在 JSON.parse 阶段已成双精度浮点、末位可能失真,工具会提示在源数据里给它加引号。

JSON / CSV 转 INSERT怎么用

  • 两行常驻控件与一格高级选项:第一行是方言、表名、下载 .sql;表名留空用占位名 your_table。第二行始终铺开最常用的四件:指定列(决定列顺序且可只写部分,对不上的名字会被点出、每行按空值写)、排除列(跳过自增主键、生成列与带 DEFAULT 的列,把数据列全排光会回退成写全部列,两个名单都支持逗号/分号/换行分隔)、每批行数、空值口径四档。布尔、JSON 列、冲突处理与冲突键/更新列,连同「标识符加引号、数字与日期按字面量、不用反斜杠转义、非 ASCII 加 N 前缀、事务包裹、生成注释」六个开关收在「高级选项」一折里,默认收起;摘要行右侧实时写「· 保持默认」或「· 已改 N 项」,N 按这 11 项与出厂默认的差数算,收起状态下也照样更新。
  • 没有假开关:控件的显隐跟着方言与模式走:「不用反斜杠转义(NO_BACKSLASH_ESCAPES)」只在 MySQL 下出现,「非 ASCII 加 N 前缀」只在 SQL Server 下出现,「冲突键」「更新列」只在选了对当前方言真正用得上它们的冲突处理时出现(不做冲突处理、以及 SQLite 的 OR REPLACE 都不需要)。藏起来只是 hidden,里面的值都保留,切回对口方言时还是你填的那份。
  • 空值口径与批量:缺值与空串默认分开处理;「不写该列(每行一条)」会改成每行一条 INSERT。每批行数默认 500,SQL Server/Oracle 自动截到 1000,MySQL 数据偏大时按提示分批,别让单条语句顶到 max_allowed_packet。空值口径四档:默认把「缺值写 NULL」与「空串写 ''」分开,也可统一 NULL、统一空串,或「不写该列」——最后这种因为多行 VALUES 要求各行列数一致,会退化成每行一条 INSERT,整行全空的行直接跳过并说明。
  • 输出与体检:头部注释汇总方言·来源·行数·语句数·列清单(可关),拆分时每段带行号。「列推断与数据体检」在页底单独一折,标题就写明收起只是藏起来、推断结果仍然用于生成:表里逐列给类型、有值/空值数、最长值与备注——非 ASCII 提示 nvarchar 与 N 前缀、含 & 提示 SQL*Plus 要先 SET DEFINE OFF、超 4000 字符提示 Oracle 需要 CLOB。没有复制按钮,输出区标题写的是「选中即可复制」,也可以直接下载 .sql(那个临时链接在点下之后延时回收,不会把下载掐死)。
  • 输入形态:JSON 对象数组的列取所有对象键的并集,某行没有的键按空值处理并记账;「列→数组」的列存写法各列长度不齐时短的补 NULL;单个对象按 1 行处理并提示改写;数组的数组里首行是全互不相同的字符串就当表头,否则列名用 column1…;基本值数组出一个 value 列。CSV/TSV 按 RFC 4180 处理,只认双引号包裹与 "" 转义,反斜杠按字面留在字段里;分隔符在前 12 行按制表符/分号/逗号的出现次数猜,判定结果写进提示。

常见问题

每批行数是不是越大越好?

合并 VALUES 确实减少往返,但两个上限绕不过:MySQL 的一条语句是一个完整网络包,超过服务端 max_allowed_packet(默认 4~64 MB)会被直接拒收,含长文本或 JSON 列的表最容易撞线,所以工具在数据超过约 4 MB 时就提示调小批大小、分批执行。SQL Server 的一条 INSERT 最多 1000 个 VALUES 行(超出报 10738)、Oracle 受 ORA-01795 约束,这两个上限由工具强制执行;Oracle 21c 之前不支持多行 VALUES,Oracle 的多行还自动改写成 INSERT ALL … SELECT 1 FROM DUAL。批太大还有个副作用:一条巨型语句失败就是整批回滚,排错也难定位到行。

MySQL 的转义和标准 SQL 为什么不一样?选错口径会怎样?

默认口径的 MySQL 把反斜杠当字符串转义引导符,所以反斜杠要写两份、单引号前加反斜杠;标准 SQL(如 PostgreSQL 默认 standard_conforming_strings=on)把反斜杠当普通字符,转义只靠单引号双写。两边写法的字节数不同,口径选错时反斜杠与引号的配对会错位,轻则报语法错,重则吃掉后半段字符串、把数据写花。工具把两种 MySQL 口径做成开关,PG 侧则注明关串时会话需要 E 前缀、而本工具不自动改。

CSV 导入时怎么区分空字符串和 NULL?

区分不了——CSV/TSV 里空字段就只是一个空字段,与「这一列没有值」在文本层同形。JSON 源则有三种状态,工具默认如实映射:null/undefined/越界写 NULL、空串写 '',也可以用空值口径统一成 NULL、统一成空串,或不写该列(改成每行一条 INSERT)。另有两个方言事实要说清:Oracle 的空字符串更等于 NULL,写 '' 进去读出来就是 NULL;NOT NULL 列不接受空串时要提前改列或改口径。

标识符、字面量与特殊值各自谁来加引号?

标识符引号 MySQL 用反引号、SQL Server 用方括号、其余用双引号,内部的定界符按各自规则双写;关掉「标识符加引号」只是不给常规名字加引号,含空格/中文/符号或撞保留字的仍强制加,否则生成的是坏语句(Oracle 不加引号还会把标识符折成大写)。数字与日期默认裸写成字面量,但前导零(邮编 007)与超过 18 位的数字保持文本形态,关掉自动识别则全部加引号;Oracle 的日期写成 DATE '…' / TIMESTAMP '…' 字面量并剥掉 Z 与时区后缀,SQL Server 可给非 ASCII 值加 N 前缀配合 nvarchar。布尔按方言走:SQL Server 与 Oracle 的 VALUES 只认 1/0(选了 TRUE/FALSE 会被换成 1/0 并说明),PostgreSQL 的 boolean 列不吃 1/0 整型字面量(选了 1/0 仍写 TRUE/FALSE),MySQL/SQLite 里 TRUE/FALSE 只是 1/0 的别名。对象与数组值既不摊平也不跳过,而是 JSON.stringify 成字符串字面量写入;把列名填进「JSON 列」后 PostgreSQL 才会补 ::jsonb 后缀,Oracle 侧提示 VARCHAR2 的 4000 字节上限。

冲突处理与事务包裹在不同方言怎么落地?

upsert 按方言映射:MySQL 用 INSERT IGNORE 与 ON DUPLICATE KEY UPDATE col = VALUES(col),PostgreSQL/SQLite 用 ON CONFLICT (键) DO UPDATE SET col = EXCLUDED.col 或 DO NOTHING,在 PG/SQLite 下选 MySQL 写法会自动换成对侧语法并说明,冲突键留空会提示执行必报「没有匹配的唯一约束」;SQL Server 与 Oracle 要用 MERGE,本工具不生成,只输出普通 INSERT。事务包裹按方言给 START TRANSACTION / BEGIN TRANSACTION / BEGIN;(Oracle 的 COMMIT 注明是 SQL*Plus 命令)。

对应功能编号 #111无需安装,手机端同样可用按 Ctrl + K 换工具