工具介绍
为测试数据库填充数据、把表格导出内容导入数据表、或迁移一小批数据,通常都是同一个起点:手上有 CSV 文件,需要的是 SQL。这个工具会解析你的 CSV(把表头行当作列名),生成一条覆盖所有数据行的 INSERT INTO 语句,可以直接粘贴进数据库客户端执行。
字符串值会用单引号包起来,内部的单引号通过写成两个来转义(比如 O'Brien 会变成 O''Brien),这是 MySQL、PostgreSQL 和 SQLite 共用的标准转义规则。空的 CSV 单元格会被写成 SQL 关键字 NULL,而不是空字符串——这是刻意的选择:表格里的空单元格通常意味着"没有值",而不是"一段空文本",大多数数据表结构对此也期望的是 NULL。
一个值要不要加引号,靠的是一个简单的启发式规则,不是真正的类型推断:如果去除首尾空格后的单元格内容看起来就是一个纯整数或小数(可以带前导负号),就原样不加引号写出;其他所有情况——包括那些看起来像数字但带有额外字符的值,比如带前导零的邮编或电话号码——都会当作字符串加引号。这样做是为了保持诚实:它适合作为小批量导入的起点,但不能替代你在真正执行前,对照实际表结构核实数据。
来源:CSV 解析遵循 RFC 4180,这是最接近正式 CSV 标准的规范;用双写单引号来转义字符串是 MySQL、PostgreSQL 和 SQLite 共同采用并记录在文档中的惯例。
为什么使用它?
- 自定义表名——设置一次目标表名,所有行都会指向这张表。
- 正确的字符串转义——值中的单引号会被写成两个,SQL 不会因此断裂或被截断。
- 可预期的 NULL 处理——空单元格变成 NULL 而不是空字符串,符合大多数数据库区分"缺失数据"的方式。
- 通用 SQL 语法——生成的 INSERT INTO ... VALUES ... 语句可以直接在 MySQL、PostgreSQL、SQLite 里运行,不用修改。
- 100% 本地运行——你的 CSV 数据(可能包含客户记录或业务数据)在浏览器里完成解析和转换,不会被上传到任何地方。
使用方法
- 粘贴带表头行的 CSV 数据,例如 name,age\nAlice,30\nBob,25。
- 输入目标表名(默认是 my_table)。
- 点击"生成 SQL"。
- 复制 INSERT INTO 语句,或下载为 .sql 文件,然后在你的数据库里执行。
示例
输入
name,age,city
Alice,30,
Bob,,NYC输出
INSERT INTO `my_table` (`name`, `age`, `city`)
VALUES
('Alice', 30, NULL),
('Bob', NULL, 'NYC');注意空单元格变成了 NULL(不是空字符串),看起来像数字的 age 值 30 没有加引号,而所有文本值都被加了引号。
实用建议
- 为本地测试数据库填充数据:从表格软件导出一小批样例数据为 CSV,在这里转换,然后在开发数据库里执行生成的 INSERT 语句。
- 在对真实数据表执行生成的 SQL 之前,一定要先核查列类型——这个工具只是用简单启发式规则区分数字和文本,并不了解你实际的表结构,某个期望特定格式的整数列可能需要手动调整。
- 如果你有成千上万行数据,本工具生成的单条多行 INSERT 语句仍然是合法 SQL,但超大语句可能触碰数据库的最大包大小限制——如果遇到这个问题,先把 CSV 拆成更小的批次。
为什么用 NULL 而不是空字符串
手写 CSV 转 SQL 脚本时一个常见的错误,是把每个缺失的单元格都当作空字符串 '' 处理。这在语法上是合法的 SQL,但通常并不是你真正想要的:一个定义为整数的列会直接拒绝 '',即便在文本列里,'' 在大多数表结构设计和查询逻辑中的语义也和"我们不知道这个值"不一样(一个 WHERE column IS NULL 的判断不会匹配空字符串,反过来也一样)。用 NULL 表示空单元格,符合大多数数据库和 ORM 框架预期的语义,也能避免某些行的数字列恰好缺失数据时引发的类型错误。
常见问题
这适用于所有 SQL 数据库吗?
生成的语法——反引号包裹的标识符、单引号包裹的字符串值、标准的 INSERT INTO ... VALUES ...——在 MySQL、PostgreSQL 和 SQLite 里都是通用的。PostgreSQL 严格来说不要求用反引号(它需要加引号时用的是双引号),但只要你的列名不是与保留字冲突的特殊名字,反引号包裹的名字在那里也不会出问题。这里并没有遵循某一个单一的官方 SQL 标准——只是选用了在主流数据库上都能直接运行的语法。
为什么空单元格会变成 NULL 而不是空字符串 ''?
这是刻意的设计:在大多数真实的 CSV 导出场景里,空白单元格意味着值未知或不适用,而不是字面意义上的"一段空文本"。大多数数据库表结构对此期望的就是 NULL。如果你的场景确实需要空字符串而不是 NULL,那些情况需要手动修改生成的 SQL。
工具是怎么判断一个值要不要加引号的?
这是一个简单的启发式规则,不是真正的类型推断:如果去除首尾空格后的单元格只由数字组成(可带前导负号、最多一个小数点),就当作数字原样写出;其他所有情况都当作字符串加引号。这意味着像 00501 这样的邮编或电话号码,只要不含额外字符,仍会被当成数字处理——所以运行 SQL 前,请务必检查邮编、编号这类看起来像数字的标识字段。
我的数据会被上传吗?
不会。CSV 解析和 SQL 生成都通过浏览器里的 JavaScript 完成——不会发送到任何服务器,可以放心用于导出的客户或业务记录。
能处理值里带逗号或引号的 CSV 吗?
可以。CSV 是用正规的带引号字段解析器来处理的,能识别引号内的逗号、换行和双写引号——不是简单地按逗号拆分——所以像 "Smith, John" 这样的字段会被当作一个整体读取,而不是被拆成两列。