记录oracle同步数据到starrocks不可见字符导致字段错位的处理
一、症状简述:
使用 datax 从 oracle 同步数据到 starrocks 的时候。总是报错如下
Reason: column count mismatch, expect=10 real=13. src line: [2018-01-08 00:00:007910001073android\N\N\N\N1pt Host Version 5.8???© Microsoff ???© Microsoff];
Reason: column count mismatch, expect=10 real=13. src line: [2018-01-08 00:00:007910001070\N\N\N\N\N1pt Host Version 5.8???© Microsoff ???© Microsoff];
但是实际从数据库查询的时候,结果是正常的
查询sql:select * from mds_login_dev_model where stat_date in(to_date(‘2018-01-08’,‘yyyy-MM-dd’)) AND INSTR(MODEL,CHR(1))>0
二、问题排查:
可以看到数据最后一个字段model 中有很多 “” 看起来像乱码,这就是数据导入报错的原因。这些字符是0x01 或者 0x02”,datax的starrocks writer默认以 0x01 作为字段分隔符 0x02 作为行分隔符。导致一个字段变成了3个字段,也就多出了2个字段,导致字段个数不匹配报错。
把这个字符,直接复制出来,去查询对应的ascii码值,值为1.
查询sql : select ascii(‘’) from dual;
三、解决方案:在旧的查询sql上做一些调整
同步时使用的旧sql:
select stat_date,game_id,agg_code,platform,area_id,group_id,channel_id,channel_name,dev_num,
model
from mds_login_dev_model where stat_date >= to_date('2018-01-08','yyyy-MM-dd' ) and stat_date <= to_date('2023-02-26','yyyy-MM-dd')
在model字段上做一些修改:
model --> replace(replace(model,chr(1),''),chr(2),'')
通过replace把model字段中的chr(1) 与chr(2)替换成空字符串,本身也是不可以见字符(不可见字符有很多,可自行搜索)。
最终sql结果:
select stat_date,game_id,agg_code,platform,area_id,group_id,channel_id,channel_name,dev_num,
replace(replace(model,chr(1),''),chr(2),'') model -- 修改本行
from mds_login_dev_model where stat_date >= to_date('2018-01-08','yyyy-MM-dd' ) and stat_date <= to_date('2023-02-26','yyyy-MM-dd')