背景:公司使用阿里云的BI工具来做数据的统计,在这之前的一个步骤是做数据的筛选.这一步使用阿里的DataWorks.使用DataWorks的过程中看log发现有一部分数据是通过DataWorks导入不到目标库的.
原因:由于公司使用的数据库是阿里云的RDS版云数据库,所以在DataWorks中配置数据源时选择的数据源的类型一直都是阿里云数据库(RDS).通过RDS实例ID等信息来配置数据源.所以我猜想这样默认采用的数据库编码是utf8.而emoji表情和一些特殊的字符是4个字节.而Mysql的utf8编码最多3个字节,所以插不进去.
背景知识:
- utf8
- 在Mysql中utf8编码的字符会占用1-3个字节来存储数据
- 只支持BMP字符
- UTF8MB4
- 在Mysql中utf8mb4编码的字符会占用1-4个字节来存储数据
- 支持BMP字符
- 还支持Supplementary字符,比如emoji符号
- Mysql5.5以上才有utf8mb4编码
从上面可以看出,utf8mb4是utf8的超集,所以从utf8升级到utf8mb4,理论上是没有任何问题的,不过对数据库版本有要求(5.5以上)。
解决方法:DataWorks配置数据源的方式有三种:阿里云数据库(RDS),有公网IP,无公网IP.可以使用用公网IP,无公网IP两种方式.然后JDBC URL 的格式配成jdbc:mysql://xxx.x.x:port/database?com.mysql.jdbc.faultInjection.serverCharsetIndex=45 就可以了