LOAD DATA报错:ERROR 1366 (HY000): Incorrect integer value

用load data导csv的时候,每次导入部分数据后就报错:ERROR 1366 (HY000): Incorrect integer value,表结构中6-7列字段为int类型,当前数据中存在连续为null的情况,比如:0,0, 后来我把csv中所有的null值都替换为0就能正常导入了。不明白这是为什么,这种情况应该怎么解决,避免每次手动替换。

image

image

2 个赞

是旁路导入么?具体的导入命令发一下啊 ob是哪个版本的

1 个赞

方案 1:LOAD DATA 语句配置 NULLIF(推荐,无需修改源 CSV)
语法关键点:
FIELDS TERMINATED BY ‘,’
NULLIF(col_name, ‘’):把读到的空字符串转换成真正数据库 NULL。
示例完整 LOAD DATA:
LOAD DATA INFILE ‘/tmp/test.csv’
INTO TABLE your_table
FIELDS TERMINATED BY ‘,’
ENCLOSED BY ‘’
LINES TERMINATED BY ‘\n’
(col1,col2,@v6,@v7,col8,…)
SET
col6 = NULLIF(@v6,’’),
col7 = NULLIF(@v7,’’);
说明:
第 6、7 列 int 字段先用用户变量@v6 @v7接收 csv 原始值;
NULLIF(@v6,’’):如果读到是空字符串’’,返回NULL;有值就返回原值;
如果你的字段允许为 NULL,就会正常写入 null;
如果字段定义是 NOT NULL,不能写 NULL,这时就需要IFNULL转 0:
SET col6 = IFNULL(NULLIF(@v6,’’),0);
含义:csv 空白 →转 NULL →再转数字 0,等价于你手动替换 csv 成 0 的效果。
方案 2:CSV 导出时把空值标记成 \N(数据库原生 NULL 标识)
OceanBase/MySQL load data 默认识别 \N 代表 NULL。
csv 写成:0,0,\N,\N,load data 读到\N直接识别为 SQL NULL,不需要额外 set 转换。
注意不是字符串 “NULL”,是反斜杠大写 N:\N。
方案 3:会话参数临时调整(不推荐生产)
set session sql_mode=’’;
去掉严格 sql_mode,数据库会容忍把空字符串转为 0 插入 int;
风险:会掩盖很多数据异常,生产环境不建议。

1 个赞

安装版本:image

命令:
image

我的CSV文件是用dbeaver直接从Oracle中导出的:
image

1 个赞

我做过其他的一些尝试,分别使用IF、NULLIF、IF+CAST,但是这三种写法都会出现问题:

IF:这种写法是可以插入所有数据,但是插入的数据会出现问题,所有int类型的字段最后都是空的;

NUIFF:报错:ERROR 1366 (HY000): Incorrect integer value;

IF+CAST:ERROR 1292 (22007): Incorrect value;

image

1 个赞

ob使用的也是oracle模式是么?

1 个赞

分别使用IF、NULLIF、IF+CAST做过尝试,但是这三种写法都会出现问题:

IF:这种写法是可以插入所有数据,但是插入的数据会出现问题,所有int类型的字段最后都是空的;

NUIFF:报错:ERROR 1366 (HY000): Incorrect integer value;

IF+CAST:ERROR 1292 (22007): Incorrect value

image

1 个赞

是社区版本的Mysql模式

1 个赞

把csv文件 发一下 看看

1 个赞

私发给你了,请查收

1 个赞

看着原因不是 INT 列“不认识 NULL”,而是 CSV 里的空字段被当成了空字符串 '',空字符串不能转成整数,所以报 ERROR 1366 。 你把空值全部替换成 0 后,空字符串变成了合法整数,导入就通了。
这样的数据导致的。
“2025-04-24”,“2025-04”,上汽大通,大通,G50 MAX PHEV,966,41,9,6
“2025-04-24”,“2025-04”,上汽大通,大通,e-Terron 9,0,

OceanBase/MySQL 默认 STRICT_TRANS_TABLES 下,'' → INT 会直接报错,而不是悄悄写成 0。LOAD DATA 又不是整句一个事务,所以会表现为“导入一部分后报错”。

1 个赞

但是我使用 if的写法将’'转换出NULL,虽然能导入成功,但是本应该有值的数据,全变成空了
image

像这样,这些本来都应该是有值的,同时还会漏掉数据
image
image

1 个赞
LOAD DATA INFILE '/root/data/FDM_DAILY_ORDER_DATA_SUB.csv'
INTO TABLE FDM_DAILY_ORDER_DATA_SUB
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(YMD, YM, 厂商, 品牌, 车型, @c6, @c7, @c8, @c9, @c10)
SET
  意向 = NULLIF(@c6, ''),
  客流 = NULLIF(@c7, ''),
  小订 = NULLIF(@c8, ''),
  订单 = NULLIF(@c9, ''),
  成交 = NULLIF(@c10, '');

你按照我的发的 导入时把空字段转成 NULL

ENCLOSED BY '"' 建议改成 OPTIONALLY ENCLOSED BY '"'。你这份 CSV 只有日期列加了双引号,数字列没有引号

其实导出时就写出真正的 NULL, 空值写成 \N ,而不是留空。Excel 默认不会这么导出了,数据处理的时候就方便了

1 个赞

这个我之前已经尝试过了,一样会报错的,包括使用IF、IF+CAST

1 个赞
LOAD DATA INFILE '/root/data/FDM_DAILY_ORDER_DATA_SUB.csv'
INTO TABLE FDM_DAILY_ORDER_DATA_SUB
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(YMD, YM, 厂商, 品牌, 车型, @c6, @c7, @c8, @c9, @c10)
SET
  意向 = IF(@c6 = '', 0, @c6),
  客流 = IF(@c7 = '', 0, @c7),
  小订 = IF(@c8 = '', 0, @c8),
  订单 = IF(@c9 = '', 0, @c9),
  成交 = IF(@c10 = '', 0, @c10);
把换行改成 \r\n,空字段写成 0 

这样试一下 怀疑客户端有时候对 \r\n处理的不一样

怀疑时NULLIF 没生效,是因为这份 CSV 是 Windows 换行 \r\n,不是 Unix 的 \n

1 个赞

解决了,问题在于LINES TERMINATED BY,原本csv文件时CRLF格式的,所以要用’\r\n’,如果转换成LF格式,就可以用’\n’了