MySQL导入含JSON数据列的CSV文件时出现Error Code:3140的问题排查及解决求助
解决LOAD DATA导入CSV时JSON格式错误(Error Code:3140)的问题
错误根源分析
你碰到的Error Code: 3140,本质是MySQL解析contracts.version_history列的JSON时,遇到了格式无效的不完整JSON。结合你给的样本数据,核心问题很明确:
- JSON数据被截断了:样本里的JSON数组最后一个对象只写到
"deleted_at"就断了——既没写完键值对(比如缺了:null),也没闭合对象的}和整个数组的],这直接让MySQL无法识别合法的JSON结构。 - 额外提一句:你样本里用
""转义JSON内部的双引号是对的,符合CSVENCLOSED BY '"'的规范,这部分没问题。
修复方案
第一步:先把CSV里的坏JSON修好
首要任务是确保所有JSON列的内容是完整合法的:
- 找到截断的那段JSON(就是样本最后那个半截的
"deleted_at"),补全成完整的JSON对象,比如参考前面的对象格式补全:{"insurance_sum":5000000.0,"no_offer":false,"change_count":0,"created_at":null,"is_preliminary_allowed":null,"remark":null,"updated_by_company_id":null,"is_approval_required":true,"changes_metadata":{},"deleted_at":null,"premium":4121.0,"updated_at":null,"deductible":null,"created_by_company_id":null,"rejection_reason":null,"updated_by_id":null,"_id":"62d55e41204b1f0007a5619f","created_by_id":null,"status":"GENERATED"} - 在整个JSON数组的末尾加上
],确保数组完全闭合。
第二步:优化LOAD DATA语句(可选但推荐)
为了避免后续再踩类似坑,可以在LOAD DATA里加个SET子句,显式验证JSON的合法性:
LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/contracts_modified.csv' INTO TABLE contracts FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS (@col1, @col2, @col3, @col4, @col5, @col6, @col7, @col8, @col9, @col10, @col11, @json_col, @col13, @col14) SET _id = @col1, broker_id = @col2, -- 把其他列按顺序对应好 version_history = IF(JSON_VALID(@json_col), @json_col, NULL), -- 替换成你实际的JSON列名 -- 剩下的列继续映射 ;
- 用
JSON_VALID()检查JSON合法性,非法的话可以设为NULL(你也可以改成抛出错误,根据自己的需求调整)。 - 注意要根据你的表结构,把CSV里的列顺序和变量一一对应,再映射到表字段。
第三步:提前验证JSON合法性
修复后,可以先用MySQL自带的函数测试一下JSON是否合法:
SELECT JSON_VALID('[{"insurance_sum":500000.0,...}]'); -- 把省略号换成你完整的JSON字符串
返回1就是合法的,返回0说明还有格式问题,得继续调整。
额外提醒
- 确保CSV里所有JSON列的双引号都用
""转义(你样本里已经做对了,不用改)。 - 如果你的
version_history列是JSON类型,MySQL会强制验证内容,所以必须保证JSON完全合法才能导入。
内容的提问来源于stack exchange,提问作者Treva Antony
相关产品推荐
相关产品推荐

