使用MySQL LOAD DATA命令加载数据时最后一列NULL值不生效问题
问题原因与解决方案
根因说明
你遇到的最后一列\N识别为N的核心原因是CSV行尾换行符与LOAD DATA默认的行终止符不匹配:
- 绝大多数Windows系统生成/导出的CSV默认用
\r\n(回车+换行)作为行终止符,而MySQL在类Unix环境下运行时,默认的LINES TERMINATED BY参数值为\n - 这种情况下,MySQL拆分完行后,会把行尾残留的
\r(回车符)加到最后一个字段的末尾,你的最后一列内容就从预期的\N变成了\N\r - 处理字段时,反斜杠会优先转义后面紧跟的
\r控制字符,原本的N失去了转义前缀,就会作为普通字符存入表中,这就是你看到最后一列存为N而非NULL的原因
可行解决方法
方法1:显式指定正确的行终止符(首选,无侵入)
先确认你的CSV实际使用的行尾符:
- 类Unix系统下可执行
od -c xyz.csv查看行尾标识,是\n还是\r\n - Windows系统下可用Notepad++的「显示所有字符」功能查看
之后在LOAD DATA命令中显式加上对应的行终止符配置即可,示例:
LOAD DATA LOCAL INFILE 'xyz.csv' INTO TABLE schema.table FIELDS TERMINATED BY '|' -- 此处根据实际行尾符二选一 LINES TERMINATED BY '\r\n' -- 适用于Windows格式CSV -- LINES TERMINATED BY '\n' -- 适用于Unix格式CSV IGNORE 1 ROWS ( col_1, col_2, ... col_n );
配置后MySQL会正确剥离行尾的所有终止符,最后一列的\N就能被正常识别为NULL。
方法2:字段转换兜底(适配特殊格式场景)
如果不方便修改CSV格式或确认行终止符,可通过用户变量+SET逻辑兜底处理最后一列:
LOAD DATA LOCAL INFILE 'xyz.csv' INTO TABLE schema.table FIELDS TERMINATED BY '|' IGNORE 1 ROWS ( col_1, col_2, ... col_n_minus_1, -- 倒数第二列正常写 @last_col -- 最后一列先赋值给用户变量 ) -- 匹配所有异常场景转成NULL SET col_n = CASE WHEN TRIM(@last_col) IN ('\N', 'N', '\N\r') THEN NULL ELSE @last_col END;
内容的提问来源于stack exchange,提问作者Russell Quinlan
相关产品推荐
相关产品推荐

