OceanBase-CDC采集表时,tinyint(1)字段类型转换问题解决

文章讲述了在使用Flink-1.16.0配合OceanBase-CDC2.3进行数据采集时遇到的问题,即tinyint(1)类型字段被错误转换为Boolean,导致写入MySQL报错。通过查看源码发现OceanBase-CDC底层将tinyint(1)映射为Boolean。解决方案是通过在OceanBase数据库连接串中添加tinyInt1isBit=false参数,避免数据类型转换错误,成功解决落库问题。作者建议深入研究技术源码以获取更深层次的理解。
摘要由CSDN通过智能技术生成

问题描述

flink-1.16.0 +OceanBase-CDC 2.3 用sql方式采集表内含有tinyint(1)类型的字段落入mysql库中报如下错误
备注:mysql库中的建表与OceanBase中的对应表字段类型保持一致
在这里插入图片描述
可以看到错误类型是String:‘true‘ 无法转换成数字类型;

问题原因:

首先进行问题排查,打印下采集到的OceanBase库数据,发现tinyint(1)类型的字段被转换成Boolean类型 true或false,原来问题出现在这。通过查看flink-cdc 2.3官方文档,截图如下。OceanBase-cdc在底层映射处理时会将tinyint(1)转换成boolean类型,那么OB库中tinyint(1)字段的值:0会转换成false,大于等于1会被转成 true,所以在写入目标端数据库时,已经被转换的String:true或false 无法转换成tinyint(1)类型,所以出现报错。
类型转换

解决方案

由于这是flink-cdc底层做的转换,全网搜索并没有直接找到解决方案。但在查找此问题时看到 mysql库tinyint(1)类型转换解决办法是在连接串添加tinyint 开关。既然mysql连接串有开关,那OceanBase完全兼容mysql,连接串肯定也可以加!于是在jar包中找到OceanBaseConnection ,果然OB库连接用的是mysql的驱动,那一定可以加了。

在下图红框连接串中添加 tinyInt1isBit=false
在这里插入图片描述
由于jar包中的源码不能直接修改,这里就不阐述具体的修改方法了,大家可以看看这篇博客文章自己动手,修改替换下jar包中的OceanBaseConnection.class文件。修改替换完成后重新编译打包运行项目,数据采集落库正常,问题完美解决。

总结来说,要想吃透技术,还是要看底层源码!建议接触新技术并能简单使用后,抽出一周左右的时间完整的看下该技术的底层源码,肯定受益匪浅。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值