如何通过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
相关产品推荐
相关产品推荐

