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语句。被判定为整数或小数的列会以不带引号的数值形式输出,其余列则以单引号括起的字符串形式输出。
使用提示
- 列的类型(整数・小数・字符串)通过检查该列所有数据行的值自动判定。只要有一个值不是数字,整列都会被视为字符串类型。
- 启用"将多行合并为一条INSERT语句"后,会生成 `INSERT INTO ... VALUES (...), (...), (...);` 这样的单条语句,可减少导入大量数据时的执行次数。
- MySQL使用反引号(`)括住表名和列名,而PostgreSQL和SQLite使用双引号("),选择的SQL方言不同,引号字符会自动切换。
- 关闭"将空值视为NULL"后,字符串类型的列会输出为空字符串(''),数值类型的列则会输出为NULL。
常见问题
会检查该列所有数据行的值:若全部为整数则判定为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)都为此专门提供了机制,可见这是一项非常常见的任务。像本工具这样的转换工具,在无需搭建那套完整机制的小规模验证或数据迁移场景中,仍然是一种方便快捷的手段。