环境信息
canal version 1.1.3-alpha-2 mysql version 5.6
问题描述
增量数据同步,插入一条数据,某个字段插入空字符串,同步到es里变成null
阅读代码,发现是com/alibaba/otter/canal/client/adapter/support/JdbcTypeUtil.java
public static Object typeConvert(String columnName, String value, int sqlType, String mysqlType) if (value == null || value.equals("")) { return null; }
这里判断空字符串 直接返回null导致
原提问者GitHub用户house0128
最新的代码是这样的:
if (value == null || (value.equals("") && !(isText(mysqlType) || sqlType == Types.CHAR || sqlType == Types.VARCHAR || sqlType == Types.LONGVARCHAR))) { return null; }
如果不是这些字符串属性的时候 value=""的话才返回null
原回答者GitHub用户rewerma
根据您的描述,使用Canal-Adapter将MySQL数据同步到ES时,发现某个字段的空字符串在ES中被转换成了null。根据您的分析,这个问题可能是由于JdbcTypeUtil.java中的空字符串判断导致的。
JdbcTypeUtil.java中的typeConvert方法是用于将数据库中的值转换为Java对象。在这个方法中,如果传递的值是空字符串,它会转换成null。因此,您在MySQL中插入空字符串时,它会被转换成null,并且在同步到ES时仍然是null。
如果您需要将空字符串同步到ES中,可以修改JdbcTypeUtil.java的typeConvert方法,以便不将空字符串转换成null。例如,您可以按照以下方式修改typeConvert方法:
public static Object typeConvert(String columnName, String value, int sqlType, String mysqlType) { if (value == null) { return null; } return value; } 在这个示例中,我们删除了将空字符串转换成null的代码,并将原始字符串值直接返回。这样,在同步到ES时,空字符串就会被正确地保留。
修改JdbcTypeUtil.java可能会影响到所有使用Canal-Adapter进行数据同步的应用程序。因此,在进行修改之前,请确保您已经全面测试了这个修改,以确保不会引入其他问题。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。