当数据源有blob nut null字段,且字段值为空的时候,otter会把这个字段值解析为null,导致目标库insert失败
源库插入了空字符,绕过了not null限制,但是在otter解析的时候空值被解析成了null值,目前仅在blob not null字段上出现了这种情况,不知道其他字段类型是否也有这种情况。
经过测试,所有binary类型的字段都有这个问题,其他类型字段无此问题:
BINARY(M) VARBINARY(M) TINYBLOB BLOB[(M)] MEDIUMBLOB LONGBLOB
原提问者GitHub用户 zing228
这是因为在MySQL中,BLOB和VARBINARY类型的字段不能设置为NULL,但是它们可以包含空值。因此,在Otter同步过程中,如果源库中的BLOB或VARBINARY字段为空,则Otter会将其解析为NULL值,从而导致插入到目标库中失败。
为了解决这个问题,建议在配置文件中设置默认字符集和字符排序规则。例如,在配置文件的dataMediaPair中,添加以下内容:
{
"source": {
"namespace": "your_namespace",
"name": "your_data_media_name",
"properties": {
"defaultCharset": "utf8",
"defaultCollation": "utf8_general_ci"
}
},
"target": {
"namespace": "your_namespace",
"name": "your_data_media_name",
"properties": {
"defaultCharset": "utf8",
"defaultCollation": "utf8_general_ci"
}
}
}
这样,Otter在同步BLOB或VARBINARY字段时就会使用指定的字符集和排序规则,从而避免了空值被解析为NULL值的问题。
另外,如果你需要动态创建表来同步数据,可以考虑使用数据库中的存储过程或触发器来实现。具体实现方式可以根据具体需求进行调整。
是的,你看我修复的代码就知道,所有非字符串类型的都有这风险. 之前mysql->oracle有个逻辑,如果是空字符可等价于NULL进行处理,而mysql中NULL,空字符是不等价,isEmptyStringNulled=false.
原回答者GitHub用户agapple
Otter同步数据时遇到了Blob Not Null字段同步问题。根据您的描述,Otter在同步Blob Not Null字段时,将空值解析为null值,导致插入失败。
针对这个问题,您可以尝试以下解决方案:
修改源库数据:您可以尝试在源库中将Blob Not Null字段的空值修改为非空值,例如一个空格字符。这样可以避免Otter将空值解析为null值。
修改目标库表结构:如果您无法修改源库数据,您可以尝试在目标库中修改表结构,将Blob Not Null字段的默认值设置为一个非空值,例如一个空格字符。
修改Otter同步任务:您可以尝试在Otter同步任务中添加一个过滤规则,将Blob Not Null字段排除在同步范围之外。这样可以避免Otter同步Blob Not Null字段的空值。
升级Otter版本:您可以尝试升级Otter到最新版本,以查看是否已经修复了这个问题。如果没有修复,您可以向Otter官方报告这个问题,以便他们进行修复。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。