MySQL LOAD DATA INFILE导入CSV时user_type字段截断错误解决求助
解决LOAD DATA INFILE导入CSV时user_type字段空值报错的问题
问题根源
虽然user_type字段允许NULL,但MySQL默认不会将CSV中的空字符串(,,之间的空内容)自动转换为NULL,而是尝试将空字符串解析为double类型,这会触发数据截断错误,尤其在严格SQL模式下会直接报错终止导入。
解决方案
方法1:使用NULLIF函数转换空字符串为NULL
这是最直接且符合需求的解决方式,通过SET子句将空字符串转为NULL:
load data infile "C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Table-2 events.csv" into table events fields terminated by "," lines terminated by "\r\n" ignore 1 lines (user_id, occurred_at, event_type, event_name, location, @user_type, device) SET user_type = NULLIF(@user_type, '');
这里先用用户变量@user_type接收CSV中的原始值,再通过NULLIF判断:如果值是空字符串,就转为NULL;如果是有效数字,则保留原数值。
方法2:临时调整SQL_MODE(仅应急参考)
如果不想修改导入语句,可以临时关闭严格SQL模式,让MySQL将空字符串转为0(但这不符合你需要NULL的业务逻辑,不推荐长期使用):
-- 临时关闭严格模式 SET SQL_MODE = ''; -- 执行导入语句 load data infile "C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Table-2 events.csv" into table events fields terminated by "," lines terminated by "\r\n" ignore 1 lines (user_id, occurred_at, event_type, event_name, location, user_type, device); -- 恢复原有SQL_MODE(请替换为你原本的设置) SET SQL_MODE = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
验证
使用方法1的语句导入你提供的示例数据时,user_type为空的行(比如11769,01-05-2014 02:37,signup_flow,create_user,United Kingdom,,lenovo thinkpad)会正确将user_type设为NULL,不会再触发截断错误。
内容的提问来源于stack exchange,提问作者Keerthana Satheesh
相关产品推荐
相关产品推荐

