You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过MySqlConnector的MySqlBulkLoader类导入CSV含null数据至MySQL表

MySqlBulkLoader导入CSV时保留NULL值的实现方案

MySqlBulkLoader本质是封装了MySQL原生的LOAD DATA LOCAL INFILE语法,默认不会把无内容的空字段解析为NULL,按下面的配置就能完整保留空值:

核心配置步骤

  • 第一步:统一CSV中的NULL标记
    不要直接用两个分隔符之间完全空白的内容表示NULL,MySQL原生识别的NULL占位符是\N,你也可以自定义为NULL这类不会和业务数据冲突的字符串,生成CSV的时候把所有需要存为NULL的字段替换成这个占位符即可。
  • 第二步:配置MySqlBulkLoader的NULL识别规则
    核心是给NullEscapeSequence属性赋值为你在CSV里用的NULL标记,同时把CSV分隔符、引号包裹规则配对,不然字段错位会导致识别失效。
  • 第三步:前置检查目标表结构
    要存NULL的对应字段不能加NOT NULL约束,否则会被强制填充字段类型的默认值,甚至直接抛约束错误。

可直接运行的代码示例

using MySqlConnector;

// 提前初始化好数据库连接,记得连接字符串里加 LocalInfile=true
await using var conn = new MySqlConnection("你的连接字符串;LocalInfile=true;");
await conn.OpenAsync();

var bulkLoader = new MySqlBulkLoader(conn)
{
    TableName = "target_order_table", // 替换成你的目标表名
    FileName = @"/data/order_source.csv", // 替换成你的CSV文件路径
    FieldTerminator = ",",
    LineTerminator = Environment.NewLine, // 自动适配Windows/Linux换行
    // 核心NULL识别配置,对应CSV里用\N标记NULL
    NullEscapeSequence = @"\N",
    // CSV字段用双引号包裹时开启下面两个配置
    FieldQuotationCharacter = '"',
    FieldQuotationOptional = true,
    NumberOfLinesToSkip = 1 // 跳过第一行表头
};

// 执行导入,返回成功插入的行数
var insertCount = await bulkLoader.LoadAsync();

常见踩坑处理

  • 如果你的CSV源文件没法修改,已经是用纯空白字段表示NULL:不要直接导正式表,先建一个所有字段都是字符串类型的临时表,全量导入后用NULLIF(字段名, '')把空字符串转成NULL,再插入正式表即可,参考SQL:
-- 临时表导入完成后执行转换插入
INSERT INTO target_order_table (order_id, user_note, pay_time)
SELECT
    order_id,
    NULLIF(user_note, ''), -- 空字符串转NULL
    NULLIF(pay_time, '')
FROM temp_order_import;
  • 不要把数值类型、日期类型的空字段留空,这类字段如果没有用NullEscapeSequence指定的标记,会被默认解析为0、0001-01-01这类无效值,不会转成NULL。
  • 如果导入时出现权限错误,检查MySQL服务端是否开启了local_infile=1配置,同时连接字符串里必须加LocalInfile=true。

内容的提问来源于stack exchange,提问作者qarly_blue

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 00:04:24