CSV 转 SQL 转换器

在浏览器中把 CSV 转成 SQL INSERT 语句,可附带 CREATE TABLE,支持 MySQL、PostgreSQL、SQLite。保留前导零,转义 MySQL 反斜杠,处理引号字段与 NULL。

  • 在浏览器中处理
  • 数据不离开你的设备
  • 免费 · 无需注册
选择 MySQL、PostgreSQL 或 SQLite 的引号规则及 CREATE TABLE 类型。更改方言会立即转换当前 CSV。MySQL 还会将字符串值中的反斜杠加倍。
表名默认为 my_table,留空时也使用它。整个名称按一个标识符加引号。编辑后停止输入 0.3 秒,输出自动更新。
批量 INSERT 用一条语句写入多行;逐行 INSERT 为每个数据行生成一条语句。更改模式会立即转换当前 CSV。
在 INSERT 前添加 CREATE TABLE。类型根据列值推断,不添加键或约束。运行 SQL 前请核对类型。
将 UTF-8 CSV 文件载入“CSV 输入”,并按当前选项转换。文件在此浏览器中读取,CSV 数据不会上传。
粘贴逗号分隔、包含表头和数据行的 CSV。停止输入 0.3 秒后自动更新输出。多出的字段补为命名列,缺少的单元格写成 NULL。
复制所有生成的 SQL 语句,包括勾选时生成的 CREATE TABLE。结果为空时无法复制。
SQL 语句将显示在这里。
示例、说明与常见问题 带实际输出的示例、与同类工具的差别,以及常见问题。

值的写法

  • 空字段输出 NULL。
  • 非空单元格全是普通数字(42、-7、19.90)的列不加引号。普通数字指没有前导零、没有 +、没有指数、最多 15 位数字。
  • 其他列一律输出带引号的字符串,其中的数字也加引号,所以 02134、1e5、20 位卡号都保持原文。目标列是数值类型时,MySQL、PostgreSQL、SQLite 都会自动转换带引号的数字。
  • 所有方言都把单引号写成两个(O”Brien)。MySQL 还会把反斜杠加倍:MySQL 默认的 SQL 模式把字符串里的 \n 读成换行(MySQL 8.4 Reference Manual, String Literals,表 11.1)。PostgreSQL 在 standard_conforming_strings 开启时(9.1 起的默认值,PostgreSQL 4.1.2.1)和 SQLite 都把反斜杠原样保存。
  • 超出表头的单元格会补上 column_3、column_4 等列,并在状态栏列出。较短的行用 NULL 补齐。

示例:引号、前导零与空字段

输入(SQLite,批量模式,表名 customers):

id,name,zip,note
1,"O'Brien, Pat",02134,
2,Lee,10001,"path C:\new"
INSERT INTO "customers" ("id", "name", "zip", "note") VALUES
(1, 'O''Brien, Pat', '02134', NULL),
(2, 'Lee', '10001', 'path C:\new');

带引号的 “O’Brien, Pat” 保留了逗号,空的 note 成为 NULL。02134 让 zip 列成为文本列,所以 10001 也加了引号。在 SQLite 3 中执行后,SELECT zip FROM customers 返回 02134 和 10001。

同样的输入选 MySQL 时反斜杠加倍,存进去的仍是 path C:\new:

id,name,zip,note
1,"O'Brien, Pat",02134,
2,Lee,10001,"path C:\new"
INSERT INTO `customers` (`id`, `name`, `zip`, `note`) VALUES
(1, 'O''Brien, Pat', '02134', NULL),
(2, 'Lee', '10001', 'path C:\\new');

如果服务器的 sql_mode 含 NO_BACKSLASH_ESCAPES,反斜杠就是普通字符,这时请改用 PostgreSQL 或 SQLite 的输出。

示例:CREATE TABLE

勾选添加 CREATE TABLE 后,列类型按值选择:整数为 INTEGER(MySQL 为 INT,超过 2,147,483,647 为 BIGINT),带小数点的数字为 DOUBLE PRECISION(MySQL 为 DOUBLE,SQLite 为 REAL),其余为 TEXT。PostgreSQL:

order_id,amount,paid_at
1001,19.90,2026-09-30
1002,5,
CREATE TABLE "orders" ("order_id" INTEGER, "amount" DOUBLE PRECISION, "paid_at" TEXT);
INSERT INTO "orders" ("order_id", "amount", "paid_at") VALUES
(1001, 19.90, '2026-09-30'),
(1002, 5, NULL);

类型有讲究时请先改再执行:金额应使用 NUMERIC / DECIMAL,paid_at 这类日期应使用 DATE 或 TIMESTAMP。工具不添加主键与约束。

示例:单元格比表头多

sku,qty
A-1,3,fragile
B-2,5
INSERT INTO "stock" ("sku", "qty", "column_3") VALUES ('A-1', 3, 'fragile');
INSERT INTO "stock" ("sku", "qty", "column_3") VALUES ('B-2', 5, NULL);

状态栏会报告补上的 column_3,需要正式列名时在表头行里改名即可。

限制

  • 分隔符只支持逗号,第一行总是表头。分号或制表符分隔的文件需要先转换。
  • 类型只根据文本判断,日期、布尔值和 1e5 都按字符串处理。
  • 表名和列名作为单个标识符加引号,public.users 会成为一个含点号的名字。
  • 大文件在浏览器标签页中一次性转换;上百万行请用数据库自带的批量导入(LOAD DATA、COPY、.import)。

FAQ

这个工具做什么?

把 CSV 数据转换成 SQL INSERT 语句,可选附带 CREATE TABLE。表头行作为列名,每个数据行成为一组值,按所选方言加引号并转义。

支持哪些 SQL 方言?

MySQL(标识符用反引号,字符串中的反斜杠加倍)、PostgreSQL 和 SQLite(标识符用双引号,反斜杠原样写出)。三者的 INSERT 语法相同。

NULL 值怎么处理?

空字段转为不加引号的 NULL。只含空格的字段是字符串,不是 NULL。工具无法生成空字符串 ''。

为什么 02134 加了引号,10001 有时不加?

只有当一列的所有非空单元格都是普通数字(无前导零、无加号或指数、最多 15 位)时,这一列才按数字输出。02134 不是普通数字,所以整个 zip 列都加引号,前导零得以保留。

数据会发送到服务器吗?

不会。转换在浏览器中用 JavaScript 完成,CSV 数据不会被传输。