SQL 转 CSV 转换器

有时你需要的数据的唯一副本,就是备份里的一个 .sql 文件,即一堆 INSERT INTO users (id, email, created_at) VALUES (...) 语句的转储。仅仅为了再次导出而把它加载进数据库既缓慢又费事。此转换器直接从 INSERT 语法读取列清单和每个 VALUES 元组,并生成一个无需还原架构即可在 Excel、Google 表格、Numbers 或 pandas 中打开的 CSV。

如何将 SQL 的 INSERT 转换为 CSV

  1. 1

    粘贴 SQL

    放入一条或多条 INSERT 语句。单行和多行的 VALUES (...) 块都受支持。

  2. 2

    自动检测列

    解析器读取 VALUES 前面的 `(col1, col2, ...)` 清单,并将其视为 CSV 的标题行。

  3. 3

    提取行

    每个 `(val1, val2, ...)` 元组会成为一行 CSV。单引号字符串会被去掉引号;数字和 NULL 作为文本原样通过。

  4. 4

    复制 CSV

    取用 CSV 输出并粘贴到电子表格,或以 `.csv` 扩展名保存。

解析器接受的内容

INSERT INTO users (id, email, created_at) VALUES
  (1, 'alice@example.com', '2024-01-12 09:00:00'),
  (2, 'bob@example.com',   '2024-01-13 10:30:00'),
  (3, 'carol@example.com', '2024-01-13 11:15:00');

将变为:

id,email,created_at
1,alice@example.com,2024-01-12 09:00:00
2,bob@example.com,2024-01-13 10:30:00
3,carol@example.com,2024-01-13 11:15:00

应用的 CSV 转义规则

  • 分隔符始终是逗号;没有可选的分隔符。
  • 包含逗号、双引号或换行符的字段会用双引号包裹。
  • 内部的双引号会被翻倍(" 变为 ""),符合 RFC 4180。
  • SQL 字符串字面量首尾的单引号会被去除。
  • SQL 的 NULL 会作为字面文本 NULL 原样通过;如果你的工具需要空单元格,请在后续步骤中替换它。

需要了解的限制

  • 必须有列清单。 解析器从 VALUES 前的 (col1, col2, ...) 清单读取标题。缺少列清单的裸 INSERT INTO t VALUES (...) 会生成没有标题的 CSV 行。
  • 一次一张表。 如果你的转储混合了不同表的 INSERT,请先将它们分开。宽度不一的行会生成参差不齐的 CSV。
  • 不解析 CREATE TABLE。 不使用列类型。日期、JSON 和二进制 blob 会作为原始文本通过。
  • 每个括号组都会成为一行。 解析器会把每个 (...) 组变成一行,因此含有括号的结尾子句(ON DUPLICATE KEY UPDATE、RETURNING)、像 NOW() 这样的函数调用,或值内部像 (1,2,3) 这样的嵌套数组,都会添加多余的行。请把输入限制为简单的 INSERT ... VALUES 元组,并在粘贴前将这类表达式替换为字面值。

常见问题

可以,只要 INSERT 遵循这些数据库共有的标准形式 INSERT INTO table (cols) VALUES (...)。此工具不运行完整的 SQL 解析器:它只提取列清单和括号内的值元组,因此请让每条语句保持简单的 INSERT 语法。

单引号 SQL 字符串内部的逗号会被保留。在输出中,任何包含逗号、引号或换行符的字段都会用双引号包裹,内部引号会翻倍,符合 RFC 4180。本身包含括号的值可能无法被正确拆分。

不能。你的 SQL 会被发送到我们的服务器,一次性解析后返回,因此请每次把输入限制在几兆字节以内。对于非常大的转储,请把文件切分为多块(每块一个 INSERT 块),分段转换。

不会,输出是一个扁平的 CSV。列类型、索引和约束存在于 CREATE TABLE 中,超出了本转换器的范围。

你的 SQL 仅被发送到我们的服务器以生成 CSV,不会被存储;我们会保留一个已转换行数的匿名计数,绝不保留 SQL 文本本身。

相关工具

此工具还提供其他语言版本