CSV 转 SQL 怎么避免导错类型?建表、NULL、日期与批量 INSERT 指南
讲清 CSV 转 PostgreSQL、MySQL、SQLite 时的字段类型推断、前导零、金额精度、NULL、日期时间、标识符转义与事务导入检查。
打开配套工具 →CSV 只有文本、分隔符和行列结构,并不携带数据库字段类型、主键、外键或约束。把 CSV 转成 SQL 的难点并不是拼出 INSERT,而是决定哪些内容应该保持文本,哪些可以安全转换成数字、布尔值或日期。
可以使用 CSV 转 SQL 建表与 INSERT 工具 在浏览器本地解析样本,选择 PostgreSQL、MySQL 或 SQLite,检查每个字段的推断类型,再生成建表和批量插入语句。生成结果应当作为可审阅草稿,而不是直接在生产库执行的迁移脚本。
为什么类型推断最容易出错
CSV 中的 00123 看起来像整数,却可能是邮编、SKU、员工编号或带前导零的账户代码。转成数字后会变为 123,原始含义无法恢复。因此,含前导零的整列更适合保留为 TEXT。
0 和 1 也可能表示布尔值、数量或等级。自动工具只能根据整列样本做推断,不能理解业务语义。导入前至少要人工检查 ID、邮编、电话、条码、金额、状态和日期字段。
如果样本只有前几百行,而后面出现了更长的文本、更高精度金额或无法解析的日期,推断仍可能失效。最终表结构应以完整数据范围和业务规则为准。
金额为什么不应随便使用浮点数
货币金额通常要使用固定精度类型,例如 PostgreSQL 的 NUMERIC(p,s) 或 MySQL 的 DECIMAL(p,s)。p 是总有效位数,s 是小数位数。金额若用 REAL、FLOAT 或 DOUBLE,二进制浮点表示可能产生细微误差,汇总和对账时会暴露出来。
自动推断可以根据样本中最长整数位和小数位给出建议,但它不知道未来最大金额,也不知道货币是否允许三位小数。正式建表时应给增长留余量,并与财务系统的舍入规则一致。
SQLite 使用动态类型系统和类型亲和性,同一个列在某些情况下可以保存不同存储类别。可参考 SQLite 官方数据类型说明。即使 SQLite 接受更宽松的值,也不等于上游数据不需要校验。
空字符串、NULL 和文本 NULL 不是一回事
空字符串 '' 表示一个存在但长度为零的文本;SQL 的 NULL 表示未知或缺失;CSV 中写着 NULL 的单元格还可能只是四个普通字母。
导入前要明确:
- 空白单元格是否写为
NULL; N/A、NA、NULL、-等占位文本是否代表缺失;- 某些字段是否允许空字符串但不允许
NULL; - 数字列中的空白是否应拒绝,而不是静默变成零。
工具允许设置空值标记,但规则应由数据提供方确认。尤其是备注、状态和商品文案,真实文本 N/A 不一定表示缺失。
日期和时间要先确定时区
2026-07-01 可以相对安全地映射为 DATE,但 2026-07-01 09:30:00 没有说明时区。它可能是北京时间、仓库当地时间或 UTC。直接写入 TIMESTAMP 之后再由不同应用解释,可能产生数小时偏差。
跨时区数据最好在源文件中使用带偏移的 ISO 8601,例如 2026-07-01T09:30:00+08:00,并明确数据库列使用带时区还是不带时区的类型。自动推断只能判断字符串形状,不能替你决定业务时区。
标识符和字符串如何正确转义
表名、字段名可能碰到 SQL 保留字,或包含空格、大小写与特殊字符。PostgreSQL 和 SQLite 通常用双引号引用标识符,MySQL 常用反引号。字符串值中的单引号要写成两个单引号,例如 O'Reilly 应生成 'O''Reilly'。
这与把用户输入直接拼进应用查询不同。在线事务代码仍应使用参数化查询或数据库驱动的批量导入接口,不能把“生成的 SQL 已转义”当成通用的防注入方案。PostgreSQL 的标识符与字符串规则可参考 官方词法结构文档。
为什么要分批生成 INSERT
一条 INSERT 包含全部几十万行,会让 SQL 文件难以查看,也可能超过数据库、代理或客户端的语句大小限制。每批 100 到 1,000 行通常更便于定位错误,但最佳批量大小取决于单行宽度和数据库配置。
大规模导入时,数据库原生的 COPY、LOAD DATA 或导入命令通常更快。SQL INSERT 更适合小中型数据、需要审阅的交付文件,或无法直接访问导入接口的场景。
执行前的安全步骤
- 保留原始 CSV,并记录字符集和分隔符。
- 检查表名、字段名、重复表头和保留字。
- 人工确认 ID、邮编、金额、布尔值、日期时间与长文本类型。
- 确认 NULL 标记和空字符串的业务含义。
- 添加真正需要的主键、唯一约束、索引、默认值和外键。
- 先在空的测试表或事务中运行,并核对行数。
- 抽查包含中文、单引号、反斜杠、换行和极端数值的记录。
- 比较导入前后金额汇总、唯一 ID 数量和空值数量。
一个可靠的 CSV 转 SQL 流程,重点不是“SQL 能执行”,而是导入后字段含义、精度、空值和记录数量仍与源数据一致。