数据集成的同步任务设置编码格式后,如果数据含有表情符,在运行任务时可能出现同步失败且产生脏数据或同步成功但数据乱码的问题。

同步失败且产生脏数据

问题描述

数据集成任务失败,且因编码问题产生脏数据,报错日志如下所示。
016-11-18 14:50:50.766 [13350975-0-0-writer] ERROR StdoutPluginCollector - 脏数据:<br> 
{"exception":"Incorrect string value: '\\xF0\\x9F\\x98\\x82\\xE8\\xA2...' for column 'introduction' at row 1","record":[{"byteSize":8,"index":0,"rawData":9642,"type":"LONG"},
{"byteSize":33,"index":1,"rawData":"A公司出来的女汉子,扛得了箱子,招待好顾客![1](http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/pic/56134/cn_zh/149872864****/%E5%9B%BE%E7%89%877.png)
被自己感动cry","type":"STRING"},
{"byteSize":8,"index":4,"rawData":0,"type":"LONG"}],"type":"writer"}
2016-11-18 14:50:51.265 [13350975-0-0-writer] WARN  CommonRdbmsWriter$Task - 回滚此次写入, 采用每次写入一行方式提交:java.sql.BatchUpdateException: Incorrect string value: '\xF0\x9F\x88\xB6\xEF\xB8...' for column 'introduction' at row 1

问题原因

在对数据库做相应的编码格式设置或添加数据源时,未将编码设置为utf8mb4。只有utf8mb4编码支持同步表情符。

解决方法

  • 添加JDBC格式的数据源时,需要修改utf8mb4的设置,例如jdbc:mysql://xxx.x.x.x:3306/database?com.mysql.jdbc.faultInjection.serverCharsetIndex=45。这样,在数据源设置表情符可以同步成功。
  • 将数据源编码格式改成utf8mb4。例如在RDS控制台修改RDS的数据库编码格式。
    说明 如果需要设置RDS数据源编码格式set names utf8mb4,在添加数据源时必须使用无公网IP+连接串方式。

同步成功但数据乱码

问题描述

数据同步任务虽然成功,但数据乱码。

问题原因

发生乱码的原因有以下三种:
  • 源端的数据本身就是乱码。
  • 数据库和客户端的编码不一样。
  • 浏览器编码不一样,导致预览失败或乱码。

解决方法

您可以针对产生乱码的不同原因,选择相应的解决方法:
  • 如果您的原始数据乱码,需首先处理好原始数据,再进行同步任务。
  • 数据库和客户端编码格式不一致,需先修改编码格式。
  • 浏览器编码和数据库或客户端编码格式不一致,需先统一编码格式,然后进行数据预览。