问题:sqoop回流数据到mysql时,emoji表情符无法导入异常。
异常信息:Caused by: java.io.IOException: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x86\x95' for column 'address' at row 6
1 表情符回流条件
表情符回流需满足以下条件:
-
sqoop低版本mysql连接驱动包不支持utf8mb4,需升级到5.1.47及以上版本
- 回流数据库、表、字段编码格式需设置为utf8mb4
- sqoop回流时,mysql数据库连接url需加上‘useUnicode=true&characterEncoding=UTF-8’指定编码格式,设置为utf8mb4是不支持的。高版本连接驱动包当参数设置为UTF8/UTF-8的时,会直接映射到utf8mb4。
2 测试
2.1 升级jar包
|
2.2 修改脚本
sqoop export --connect "jdbc:mysql://$HOSTNAME:$PORT/$DBNAME?tinyInt1isBit=false&useUnicode=true&characterEncoding=UTF-8" \
--username $username --password $password --table $target_table --fields-terminated-by '\001' --input-null-string '\\N' --input-null-non-string '\\N' --export-dir $hdfs_temp_dir &&
注:加粗字体为修改部分
2.3 修改字段编码格式
默认需dba将库编码格式修改为utf8mb4。
建表时需指定表及相关字段编码格式为utf8mb4。
修改字段编码格式示例:
ALTER TABLE sync_shop_test_d CHANGE address address VARCHAR(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;