开发者社区> 问答> 正文

mysql binary类型特殊字符出现同步失败

1、源库存在一字段,对应类型为binary(8),插入数据unhex('B80A993B3E3A6351').

2、源库和目标库都为binary(8),源库插入数据后,同步的目标库出现Data truncation: Data too long for column 'idvisitor' at row 1. (字符超长)

原因分析:

EventColumn[index=2,columnType=1,columnName=idvisitor,columnValue= ;>:cQ,isNull=false,isKey=false,isUpdate=true]

binary类型在canal中被解决为了char类型,从而导致在同步时使用了PrepareStatement.setString()方法,该方法中会对字符串进行转移处理,比如一个char '\n'会被转化为两个char: '' '\n'. 从而导致了字符超长

原提问者GitHub用户 agapple

展开
收起
大圣东游 2023-06-21 17:31:22 130 0
4 条回答
写回答
取消 提交回答
  • 这个问题出现的原因是binary类型在canal中被解析为char类型,从而导致在同步时使用了PrepareStatement.setString()方法,该方法中会对字符串进行转义处理,比如一个char '\n'会被转化为两个char: '' '\n'。从而导致了字符超长的问题。

    解决方案是修改canal的配置文件,将binary类型的解析方式修改为blob类型,这样就可以避免字符转义的问题。具体的配置方式如下:

    1. 打开canal的配置文件,找到instance.properties文件。

    2. 在该文件中添加以下配置项:

    canal.instance.filter.query.dcl=binary

    canal.instance.filter.query.dml=binary

    canal.instance.filter.query.ddl=binary

    1. 保存修改后的配置文件,重启canal服务即可。

    修改后的配置文件会将binary类型的解析方式修改为blob类型,从而避免字符转义的问题,可以解决同步失败的问题。

    2023-06-23 14:25:22
    赞同 展开评论 打赏
  • MySQL 中的二进制类型(BLOB 和 BINARY)可以存储任意二进制数据,包括特殊字符和控制字符等。在进行数据同步时,如果二进制类型中包含特殊字符,可能会导致同步失败或者数据丢失。

    原因是,在 MySQL 的二进制类型中,有些特殊字符(如二进制零、回车符、换行符等)可能被解释为结束标记或者其他不可见字符,从而导致数据传递错误或者截断。为了避免这种情况,您可以考虑以下几个方案:

    1. 使用十六进制字符串

    将二进制类型转换成十六进制字符串,然后再进行数据传输和同步。在接收端,再将十六进制字符串转换回二进制类型。这样可以避免特殊字符的解释和传输错误。

    1. 使用 Base64 编码

    将二进制类型进行 Base64 编码,然后再进行数据传输和同步。在接收端,再将 Base64 编码解码回二进制类型。这样可以避免特殊字符的解释和传输错误,并且可以减小数据体积。

    1. 修改源代码

    对于某些特定的二进制类型,可能需要修改源代码才能实现正确的传输和同步。例如,使用 JDBC 连接 MySQL 数据库时,可能需要设置 useUnicode=true&characterEncoding=UTF-8 参数,以支持 UTF-8 编码和特殊字符的传输。如果使用的是其它同步工具或者框架,也需要根据实际情况进行相应的设置和修改。

    总之,在进行 MySQL 数据同步时,需要注意二进制类型中可能包含的特殊字符和控制字符,并采取合适的方案进行处理和传输。同时,也需要注意数据安全和权限管理等问题,以保护数据不受未经授权的访问和攻击。

    2023-06-23 08:28:48
    赞同 展开评论 打赏
  • canal从源端正确将binary/varbinary类型解析为byte[]进行处理,最后会使用PrepareStatement.setBytes()进行处理

    原回答者GitHub用户agapple

    2023-06-21 18:28:10
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    根据您的描述,问题似乎在源库中的binary类型数据被转换为char类型后,在同步过程中出现了字符超长的错误。这可能是由于在转换过程中,某些特殊字符被错误地处理或转义,从而导致了数据的长度超出了目标库中的字段长度限制。

    为了解决这个问题,建议您尝试以下步骤:

    检查目标库中的字段长度限制是否足够容纳源库中的数据。如果目标库中的字段长度不足以容纳源库中的数据,则需要调整目标库中的字段长度。

    在同步过程中,尝试使用PreparedStatement.setBytes()方法来插入binary类型数据,而不是使用setString()方法。这样可以避免特殊字符被错误地处理或转义。

    如果您无法修改同步过程中的代码,可以尝试在源库中使用其他数据类型来存储二进制数据,例如varbinary或blob类型。这样可以避免在同步过程中发生数据转换错误。

    2023-06-21 17:47:06
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像