打开或粘贴 CSV 文件,选择 数据库 和 语句,脚本就会显示在选项旁边。默认生成一个 PostgreSQL 事务:先用 CREATE TABLE IF NOT EXISTS 建一张全为 TEXT 列的表,再以每条 100 行的 INSERT 写入数据,所以 00412 仍是 '00412'。如果表中需要数字、布尔和 DATE 类型的列,请选择 识别数字和 true/false。文件在你的浏览器中转换,不会上传。
如何把 CSV 转换为 SQL
- 打开
.csv、.tsv或.txt文件,拖到工具上,或粘贴数据。分隔符会自动识别;可在 导入设置 中设置分隔符、表头行,或选择 Windows-1252、GB18030 等旧编码。 - 选择 数据库:PostgreSQL、MySQL / MariaDB、SQLite 或 SQL Server。检查 表名:它初始为文件名,其中的空格和标点会变成下划线(
sales report.csv变成sales_report)。 - 选择 语句;如果是 UPSERT、UPDATE 或 DELETE,请勾选能标识一行的 关键列。
- 检查预览,然后点击 复制,或下载
.sql文件,用数据库客户端运行,例如psql -f data.sql。
要用相同设置为多个文件生成脚本,请选择 批量转换多个文件。每个文件依次转换,脚本打包成一个 ZIP 一起下载。
语句与选项
| INSERT | 多行的 INSERT INTO … VALUES 语句。每条 INSERT 的行数 决定一条语句包含多少行(1–1,000,默认 100);SQL Server 不接受超过 1,000 行。 |
|---|---|
| UPSERT(插入或更新) | 每行一条语句:插入该行,或更新关键值相同的现有行。PostgreSQL 和 SQLite 使用 ON CONFLICT (…) DO UPDATE SET … = excluded.…,MySQL 使用 ON DUPLICATE KEY UPDATE,SQL Server 使用 MERGE。目标表的关键列上必须有主键或唯一索引。 |
| UPDATE | 每行生成一条 UPDATE … SET … WHERE key = …;关键列本身不会被修改。如果所有列都是关键列,就没有可更新的内容,不会写出任何语句。 |
| DELETE | 每行生成一条 DELETE FROM … WHERE key = …。空的关键值会写成 IS NULL。 |
| 关键列 | UPSERT、UPDATE 和 DELETE 必须指定;没有 WHERE 关键条件时,工具不会写出这些语句。开启 添加 CREATE TABLE 时,关键列会设为 NOT NULL 并作为 PRIMARY KEY。 |
| 添加 CREATE TABLE | 默认开启。写出 CREATE TABLE IF NOT EXISTS(SQL Server 或在 DROP 之后则使用普通的 CREATE TABLE)。 |
| 先添加 DROP TABLE IF EXISTS | 替换已存在的同名表。默认关闭;运行脚本时,旧表及其数据都会丢失。 |
| 包在事务中 | 默认开启:BEGIN; … COMMIT;(MySQL 使用 START TRANSACTION;,SQL Server 使用 BEGIN TRANSACTION;)。 |
| 空单元格写为 NULL | 默认开启。关闭后,空单元格会写成 ''。 |
列类型与引号
使用 所有值都保留为文本(默认)时,每一列都是 TEXT(SQL Server 中为 NVARCHAR(MAX)),每个值都是带引号的字符串字面量,所以前导零、长编号和特殊格式的日期都能原样导入。
使用 识别数字和 true/false 时,只有当某列所有非空值都符合某种类型,该列才会采用这种类型:
| 整数 | INTEGER;如果有值超过 9 位,则为 BIGINT。值不加引号写出。带前导零或超过 9,007,199,254,740,991 的数字会让该列保持为文本。 |
|---|---|
| 小数(有效数字不超过 15 位) | PostgreSQL 中为 NUMERIC,MySQL 和 SQL Server 中为按数据确定精度的 DECIMAL(p,s),SQLite 中为 REAL。1,5 这样的逗号小数会让该列保持为文本。 |
| true / false(大小写不限) | 在 PostgreSQL 和 MySQL 中生成 BOOLEAN 类型的列,值写为 TRUE/FALSE;在 SQL Server 中生成 BIT 类型的列,值写为 1/0;在 SQLite 中生成 INTEGER 类型的列,值同样写为 1/0。 |
| YYYY-MM-DD 格式的日期 | DATE,值带引号,例如 '2026-03-01';SQLite 中为 TEXT。日期时间和其他日期格式保持为文本。 |
- 表名和列名完全按原样加引号,所以空格、保留字和中文等非拉丁名称都能使用:PostgreSQL 和 SQLite 中为
"order date",MySQL 中为 `order date,SQL Server 中为[order date]`。名称中的引号字符会写成两个。 - 值中的单引号会写成两个(
O'Brien变成'O''Brien')。对于 MySQL,反斜杠也会写成两个,因为 MySQL 默认把\当作转义符。SQL Server 的字面量会加上N前缀,以保留 Unicode 文本(包括中文)。 - CSV 中带引号的值内的换行,会保留在 SQL 字符串字面量中。
- 大多数数据库无法保存 NUL 字符;这些字符会被删除,工具会报告删除了多少个。
常见问题排查
- 脚本中所有内容都在一列里。 分隔符识别错了;请在 导入设置 中设置后重新打开文件。
- 数字列变成了 TEXT。 至少有一个值不是普通数字,例如
12 kg、1,5或007。可以在 CSV 在线查看 中找到它,或用 CSV 数据清洗 整理该列。 - UPSERT 因缺少约束而失败。 只有当目标表的关键列上有主键或唯一索引时,
ON CONFLICT和ON DUPLICATE KEY才能生效。请为现有表添加索引,或让 添加 CREATE TABLE 来创建主键。 - MySQL 或 SQL Server 拒绝了 PRIMARY KEY。 保持为文本的关键列会被创建为
TEXT(MySQL/MariaDB)或NVARCHAR(MAX)(SQL Server),而这两种数据库都无法对这些类型建立完整索引。请自己用VARCHAR类型的主键建表,然后关闭 添加 CREATE TABLE。 - SQL Server 提示表已存在。 SQL Server 脚本使用普通的
CREATE TABLE。如果要导入现有表,请关闭 添加 CREATE TABLE;如果要替换它,请开启 先添加 DROP TABLE IF EXISTS。 - 脚本执行到一半停止了。 数据库的错误信息会指出出错的语句;常见原因是关键值重复,或某个值不符合现有表的列类型。请用 CSV 校验 检查文件,然后重新运行脚本。
大文件与限制
25 MB、10 万行或 200 万个单元格以内的文件可实时预览。更大的文件以流式方式转换:预览显示前 200 行,文件分块读取两遍(第一遍了解列的类型和宽度,第二遍写出脚本),下载内容包含所有行。单个脚本最大 4 GB。
转换在当前标签页的后台线程中进行,所以页面保持流畅,点击 取消 即可停止。CSV 文件不会发送到任何服务器。如果想直接得到数据库文件而不是脚本,请使用 CSV 转 SQLite。
示例
一份客户列表,包含带前导零的 ID、带撇号和逗号的姓名,以及一个空的套餐值,使用默认设置转换,表名为 customers。如果选择 识别数字和 true/false,signup_date 会变成 DATE,monthly_fee 会变成 NUMERIC 并以不带引号的 29.00 写出,active 会变成 BOOLEAN 并写成 TRUE/FALSE,而 customer_id 仍是 TEXT。
customer_id,name,signup_date,plan,monthly_fee,active 00412,"O'Brien, Kate",2026-03-01,pro,29.00,true 00413,Luis Ortega,2026-03-04,,0,false
BEGIN;
CREATE TABLE IF NOT EXISTS "customers" (
"customer_id" TEXT,
"name" TEXT,
"signup_date" TEXT,
"plan" TEXT,
"monthly_fee" TEXT,
"active" TEXT
);
INSERT INTO "customers" ("customer_id", "name", "signup_date", "plan", "monthly_fee", "active") VALUES
('00412', 'O''Brien, Kate', '2026-03-01', 'pro', '29.00', 'true'),
('00413', 'Luis Ortega', '2026-03-04', NULL, '0', 'false');
COMMIT;常见问题
为什么默认每一列都是 TEXT?
CSV 没有数据类型,而类型猜错就会丢数据:像 00412 这样的 ID 存成整数就会变成 412。文本类型能完全按文件内容导入。如果需要数字、布尔和 DATE 类型的列,请选择 识别数字和 true/false。
脚本能在哪些数据库中运行?
PostgreSQL、MySQL 和 MariaDB、SQLite,以及 SQL Server,每种数据库都使用各自的标识符引号、字符串转义、布尔值和 UPSERT 语法。下载前请选择对应的 数据库;为一种数据库生成的脚本不能直接用于其他数据库。
能生成 COPY 或 LOAD DATA 命令,而不是 INSERT 吗?
不能。脚本使用标准的 INSERT、UPSERT、UPDATE 或 DELETE 语句。如果数据量非常大,可以考虑使用数据库自带的批量导入工具直接读取 CSV,例如 PostgreSQL 的 COPY 或 MySQL 的 LOAD DATA。