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语句的步骤
- 粘贴CSV数据 将CSV内容粘贴到输入框中。如果数据以制表符分隔,请先把分隔符改为制表符。
- 设置表名与方言 输入目标表的名称,并选择要使用的数据库方言,标识符的引号字符会随之自动切换。
- 选择输出选项 按需勾选是否同时生成CREATE TABLE语句、是否将空值视为NULL,以及是否将多行合并为一条INSERT语句。
- 复制并执行 复制生成的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语句中一次性写入的方式,能减少语句解析和事务提交的次数,从而提升执行效率。
常见问题
闲话 ― 为什么说合并后的INSERT语句更"快"
本工具可生成的"将多行合并为一条INSERT语句"(`INSERT INTO t VALUES (1,'a'), (2,'b'), ...;`)在执行速度上,通常比逐行发出单独的INSERT语句要快得多。这是因为它减少了数据库解析每条SQL语句、生成执行计划的开销,以及每条语句都要重复一次事务提交所产生的成本。
不过,MySQL存在 `max_allowed_packet` 限制,PostgreSQL也有类似的通信缓冲区上限,如果将过多的行塞进一条INSERT语句中,可能会超出该上限而导致错误。实际工作中,通常会将语句按每几百到几千行进行拆分。
将CSV文件导入测试数据库的工作,在开发现场常被称为"准备种子数据(seeding)",许多Web框架(例如Laravel的seeder和factory)都为此专门提供了机制,可见这是一项非常常见的任务。像本工具这样的转换工具,在无需搭建那套完整机制的小规模验证或数据迁移场景中,仍然是一种方便快捷的手段。