CSV转SQL转换器(生成INSERT语句)

将CSV文件转换为SQL的INSERT语句和CREATE TABLE语句。支持MySQL、PostgreSQL、SQLite三种方言,并自动判定列的类型(整数・小数・字符串)。转换处理完全在浏览器内完成,数据不会发送到服务器。

分隔符
将第一行作为表头
表名
SQL方言
同时生成CREATE TABLE语句
将空值视为NULL
将多行合并为一条INSERT语句


            
            已复制!
            
          

输入CSV数据后,生成的SQL语句将显示在此处。

CSV行与INSERT语句的对应关系

CSV的一行 name,age,city
转换后的INSERT语句 INSERT INTO `my_table` (`name`, `age`, `city`) VALUES ('Alice', 30, 'Tokyo');

将第一行作为表头时,第二行及以后的每一行都会转换为一条指定了表头列名的INSERT语句。被判定为整数或小数的列会以不带引号的数值形式输出,其余列则以单引号括起的字符串形式输出。

什么是CSV转SQL转换器

需要把手头的CSV导入数据库时,逐行手写INSERT语句既繁琐又容易出错,数据量一大更是难以保证准确性。本工具会读取CSV内容,将每一行自动转换为对应的INSERT语句。列的类型通过扫描全部数据行来判定整数、小数或字符串,因此还能一并生成CREATE TABLE语句,省去单独设计表结构的步骤,尤其适合手头还没有现成表结构的临时导入需求。

工具支持MySQL、PostgreSQL、SQLite三种方言,切换方言时,标识符的引号字符和类型名称会自动跟着调整,不必自己逐一改写。值中出现的单引号也会按SQL标准方式自动转义,生成的语句可以直接复制执行,无需再手动检查特殊字符。整个转换过程都在浏览器内完成,CSV内容不会被发送到任何服务器,即使是包含真实业务数据的文件也可以放心处理。

生成INSERT语句的步骤

  1. 粘贴CSV数据 将CSV内容粘贴到输入框中。如果数据以制表符分隔,请先把分隔符改为制表符。
  2. 设置表名与方言 输入目标表的名称,并选择要使用的数据库方言,标识符的引号字符会随之自动切换。
  3. 选择输出选项 按需勾选是否同时生成CREATE TABLE语句、是否将空值视为NULL,以及是否将多行合并为一条INSERT语句。
  4. 复制并执行 复制生成的SQL语句,粘贴到数据库客户端中执行。数据量较大时,建议分批执行。

用好本工具的小技巧

  • 列的类型(整数・小数・字符串)通过检查该列所有数据行的值自动判定。只要有一个值不是数字,整列都会被视为字符串类型。
  • 启用"将多行合并为一条INSERT语句"后,会生成 `INSERT INTO ... VALUES (...), (...), (...);` 这样的单条语句,可减少导入大量数据时的执行次数。
  • MySQL使用反引号(`)括住表名和列名,而PostgreSQL和SQLite使用双引号("),选择的SQL方言不同,引号字符会自动切换。
  • 关闭"将空值视为NULL"后,字符串类型的列会输出为空字符串(''),数值类型的列则会输出为NULL。

CSV转SQL转换器的应用场景

准备测试用的种子数据

可以直接把电子表格里整理好的验证数据转换为INSERT语句,适合不必专门编写框架种子脚本、快速跑通验证流程的小规模测试场景。

迁移主数据

将旧系统导出的CSV转换为可导入新数据库的格式,同时还能获得对应的CREATE TABLE语句,省去手动核对字段类型的步骤。

核查列的数据类型

通过查看自动判定的类型,可以发现列中混入了意料之外的值——本应是数值的列若被判定为字符串类型,往往就是数据异常的信号。

比较不同方言的写法

用同一份CSV切换不同方言,即可直观比较标识符引号和类型名称等语法差异。

SQL导入相关术语

INSERT语句
用于向表中新增数据行的SQL语句,通过列名与对应的值来指定要写入的内容。
CREATE TABLE语句
用于新建表结构的SQL语句,定义列名及其类型。当目标表尚不存在时需要用到它。
SQL方言
不同数据库产品之间的语法差异,例如标识符的引号字符、类型名称的写法都可能不同。
NULL
表示"值不存在"的特殊标记,与空字符串是两个不同的概念,因此需要明确空值的处理方式。
转义
将具有特殊语法含义的字符处理为普通字符的操作,值中出现的单引号就是典型的转义对象。
批量插入
将多行数据合并到一条INSERT语句中一次性写入的方式,能减少语句解析和事务提交的次数,从而提升执行效率。

常见问题

会检查该列所有数据行的值:若全部为整数则判定为INTEGER类型,若全部为小数则判定为REAL类型,其余情况(字符串或混合)判定为TEXT类型。生成CREATE TABLE语句时会直接采用该判定结果作为列类型。

可以。在"SQL方言"中选择PostgreSQL或SQLite后,表名・列名的引号(双引号)和类型名会输出为对应数据库所遵循的格式。

按照SQL标准的转义方式,单引号会自动转换为两个连续的单引号(''),因此生成的语句可以直接执行。

不会。所有转换处理都在浏览器内的JavaScript中完成,您输入的CSV内容不会被发送到任何服务器。即使是包含实际数据的CSV,也可以放心使用。
工具君

闲话 ― 为什么说合并后的INSERT语句更"快"

本工具可生成的"将多行合并为一条INSERT语句"(`INSERT INTO t VALUES (1,'a'), (2,'b'), ...;`)在执行速度上,通常比逐行发出单独的INSERT语句要快得多。这是因为它减少了数据库解析每条SQL语句、生成执行计划的开销,以及每条语句都要重复一次事务提交所产生的成本。

不过,MySQL存在 `max_allowed_packet` 限制,PostgreSQL也有类似的通信缓冲区上限,如果将过多的行塞进一条INSERT语句中,可能会超出该上限而导致错误。实际工作中,通常会将语句按每几百到几千行进行拆分。

将CSV文件导入测试数据库的工作,在开发现场常被称为"准备种子数据(seeding)",许多Web框架(例如Laravel的seeder和factory)都为此专门提供了机制,可见这是一项非常常见的任务。像本工具这样的转换工具,在无需搭建那套完整机制的小规模验证或数据迁移场景中,仍然是一种方便快捷的手段。