chunjun
chunjun copied to clipboard
logminer插件 从日志中读取到的sql中文UNISTR转码问题
logminer插件从日志中读取到的sql中文有UNISTR转码,sink为oracle时将oracle的unistr函数当作字符串写入
com.dtstack.flinkx.connector.oraclelogminer.listener.LogParser 的parseString方法中添加 以下代码,UNISTR开头的话将16进制数字转为字符串 if (value.startsWith("UNISTR('")) { try { String s1 = value.substring(8, value.length() - 2); if (StringUtils.isNotEmpty(s1)) { return decodeUnicode(s1); } else { return ""; }
} catch (Exception e) {
throw new RuntimeException("parse value [" + value + " ] failed ", e);
}
}
public static String decodeUnicode(String dataStr) {
int start = dataStr.indexOf("\\");
int end = 0;
final StringBuffer buffer = new StringBuffer(dataStr.substring(0, start));
while (start > -1) {
end = dataStr.indexOf("\\", start + 1);
String charStr = "";
if (end == -1) {
charStr = dataStr.substring(start + 1, dataStr.length());
} else {
charStr = dataStr.substring(start + 1, end);
}
char letter = (char) Integer.parseInt(charStr, 16); // 16进制parse整形字符串。
buffer.append(new Character(letter).toString());
start = end;
}
return new String(buffer.toString().getBytes(), StandardCharsets.UTF_8);
}
Hello, thanks for your comment. Can you provide a pr to fix it?
PR merged.