开发者社区> 问答> 正文

Canal-Adpater 同步es 数据 空字符串变null

环境信息

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

展开
收起
古拉古拉 2023-05-08 13:44:06 68 0
2 条回答
写回答
取消 提交回答
  • 最新的代码是这样的:

    if (value == null || (value.equals("") && !(isText(mysqlType) || sqlType == Types.CHAR || sqlType == Types.VARCHAR || sqlType == Types.LONGVARCHAR))) { return null; }

    如果不是这些字符串属性的时候 value=""的话才返回null

    原回答者GitHub用户rewerma

    2023-05-09 17:46:36
    赞同 展开评论 打赏
  • 随心分享,欢迎友善交流讨论:)

    根据您的描述,使用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进行数据同步的应用程序。因此,在进行修改之前,请确保您已经全面测试了这个修改,以确保不会引入其他问题。

    2023-05-08 13:47:40
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载