Informatica解决字段字符集不一致问题
业务场景
当我们在使用 Informatica 将 MySQL 8 中的数据推送至 MySQL 5.7 中时,发现有些字段数据推送失败,通过检查 infa 中字段名字和映射都没问题。这时候就得注意是否是因为数据库版本不兼容的问题。列如以下这种情况:
在MySQL 8 版本中默认使用utf8mb4\utf8mb4_0900_ai_ci,而在 MySQL 5.7 中的默认字符集是 utf8_general_ci。而字符集 utf8mb4_0900_ai_ci 是 MySQL 8 中特有的,MySQL 5.7版本是不支持这个字符集的。因此当你在将 MySQL 8 中的数据推送至 MySQL 5.7 时,就会出现 MySQL 8 中字符集为 utf8mb4_0900_ai_ci 的字段数据推送失败。
解决方案
修改 MySQL 8 版本的字符集
首先是最简单的一种解决方案,修改 MySQL 8 版本的字段字符集,让高版本的 MySQL 能够兼容低版本的 MySQL。
升级低版本的 MySQL 数据库
将 MySQL 5.7 升级为 MySQL 8 版本
取数时修改数据字符集
其次,针对一些特殊场景,因为业务需要必须使用到 MySQL 8 版本的utf8mb4_0900_ai_ci 字符集并且不能够修改 MySQL 8 中的字符集,又因为现有的MySQL5.7 数据存储量已经非常大了,如果升级迁移数据难免会发生一些未知问题,但是我们又必须将这些数据存入咱们的低版本数据库中。这时候前两种方案就不适用了。
这时我们可以考虑在取 MySQL 8 数据库中的数据时做一些处理。MySQL中有一个函数就可以帮我们解决这个问题:
CONVERT(需要转换的字段 USING utf8mb4) COLLATE utf8mb4_bin AS '字段重命名'
我们只需要在infa中将这句字符集转换添加到对应的字段上即可大功告成。下列是我的示范sql语句:
SELECT
b.company_id,
CONVERT(b.company_name USING utf8mb4) COLLATE utf8mb4_bin AS 'company_name',
CONVERT(b.company_code USING utf8mb4) COLLATE utf8mb4_bin AS 'company_code',
b.is_supplier,
b.is_purchaser,
b.is_foreign_company,
b.tyc_id,
b.created_time,
b.update_time
FROM
b
这里我将从 MySQL 8 中取出的字符集为 utf8mb4_0900_ai_ci 的数据转换为了字符集为 utf8mb4_bin 的数据,这样我们就能正常推送至 MySQL5.7 中了。
在这个里面将我们的sql语句替换上去即可,再点击应用并确定即可,接下来运行我们的工作流就可以看到数据已经成功推送过去了。