lightning导入CSV时,无法正确区分处理空字符串和空值(""和NULL)

【 TiDB 使用环境】生产环境 /测试/ Poc
数据迁移导入
【 TiDB 版本】
v7.1.0、v7.1.1和v7.1.2
【复现路径】做过哪些操作出现的问题
按照标准流程导入csv文件即可复现,CSV和Lightning配置文件如下:
light.toml (429 字节)
lightningtest.NTEST.csv (60 字节)
【遇到的问题:问题现象及影响】
CSV文件中,使用逗号,作为字段分隔符,使用双引号"作为定界符。
测试的表结构如下:
create table NTEST(id bigint primary key, name varchar(32), remark varchar(128));

预期结果为,CSV源自另一个非MYSQL数据库,其中同一列同时存在长度为0的字符串也就是空字符串"“,和NULL值。导入后,”"应在tidb中处理为空字符串,NULL值应处理为NULL。

实际结果如下,空字符串和NULL值均被处理为NULL值存入TiDB数据库,与预期不符。
image

【资源配置】
不涉及
【附件:截图/日志/监控】

tidb中不区分null 和’’ ,都是null

lightning工具是可以区分null值和空串的,你试下这俩参数

CSV 文件是否包含 NULL。

如果 not-null = true,CSV 所有列都不能解析为 NULL。

not-null = false

如果 not-null = false(即 CSV 可以包含 NULL),

为以下值的字段将会被解析为 NULL。

null = ‘\N’

是否对字段内“\“进行转义

2 个赞

这样肯定是不合理的,最后我们也是用了替换后update的方式,将’'写入到tidb。

在我模拟复现的场景中,lightning的配置文件里
关于not-null参数:
not-null是设置为false的,这是因为csv实际上来源于另一个非MySQL生态数据库,其中的NULL值需要迁移到tidb;

关于null= ‘\N’ 参数:
目前我们测试过程中,由于源端数据库导出到csv时,NULL值处理为两个连续的分隔符,也就是两个逗号,,如果null=‘\N’,则这种NULL值也无法处理导入到tidb,所以需要把null=设置为’'。

综上,这次的导入受限于源库导出的CSV,而导出的csv中是可以明确区分空字符串和NULL值的(,“”,和,),我们希望lightning也可以按照这样的逻辑区分并处理到tidb,但并未找到可行的配置方案。

受限于项目的时间要求,我们是通过sed批量替换-导入tidb后批量update的方式绕过了这个问题

我们也遇到了相同问题

确实是一个功能上的缺失,如果数据量大手动替换就很麻烦

1 个赞

可以到问题专区提一个issue ,如果真的是有功能上的优化点后续应该可以得到优化

必须按lightning设置的来识别空串和null值

应该改进下

碰到过这种问题,数量量小的话一般是在源头将空值先填充一个特殊字符串,导入后再处理

1 个赞

碰到过,只能手动先处理了

1 个赞

lightning 确实处理 ,“”, 和 , 的行为是一样的 :smiling_face_with_tear:

这个处理起来比较麻烦,好像只能手动去解决 :thinking:

1 个赞

想问问后续是否有解决这个场景下这个问题的计划,或者怎样提交需求。

感觉代码技术层面解决应该不会太复杂。

对于 mysql 数据源是有解决方案的,可以使用 dumpling 在导出的时候指定导出的 null 值。https://docs.pingcap.com/tidb/stable/dumpling-overview

对于非 mysql 数据源,暂时应该没有计划,可以上 https://github.com/pingcap/tidb/issues/new/choose 提 issue 试试

1 个赞

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。