解决trino查询show create table中文乱码问题
trino在使用show create table时,如果结果包含中文就会乱码(不是乱码,只是不支持中文字符编码,故需要转换一下)
本案例中,为了获取到表注释,使用show create table,但是表注释中含有中文,所以编写了一个工具类进行转化,代码如下,可以参考一下:
import cn.hutool.core.text.UnicodeUtil;
import org.apache.commons.lang3.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author sanmuchen
* @date 2024/09/20 10:28
*/
public class CommentUtil {
private static final Pattern COMMENT_PATTERN = Pattern.compile("\\n\\)\\nCOMMENT(.*?)\\nWITH \\(\\n", Pattern.DOTALL);
private static final Pattern CHINESE_COMMENT_PATTERN = Pattern.compile("U&'(.*?)'");
private static final Pattern ENGLISH_COMMENT_PATTERN = Pattern.compile("^\\s*'(.*)'\\s*$");
private CommentUtil() {
}
/**
* 通用方法,用于提取正则表达式匹配的内容
*
* @param pattern 正则表达式模式
* @param input 输入字符串
* @return 匹配到的内容,如果没有匹配到则返回 null
*/
private static String extractMatch(Pattern pattern, String input) {
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
// 获取匹配到的组, group(1) 是第一个括号内的内容
return matcher.group(1);
} else {
return StringUtils.EMPTY;
}
}
/**
* 从show create table结果中获取到表注释
*
* @param createTableResult 建表语句
* @return 表注释
*/
public static String getDecodedTableComment(String createTableResult) {
String comment = extractMatch(COMMENT_PATTERN, createTableResult);
return dealWithComment(comment);
}
/**
* 处理获取到的注释
*
* @param comment 表注释
* @return 处理后的表注释
*/
private static String dealWithComment(String comment) {
//中文编码
if (StringUtils.contains(comment, "U&'")) {
String encodedComment = extractMatch(CHINESE_COMMENT_PATTERN, comment);
return decodeUnicode(encodedComment);
}
//英文编码
return extractMatch(ENGLISH_COMMENT_PATTERN, comment);
}
private static String decodeUnicode(String encodedComment) {
// 在每个 \\ 后面加上 u
String modifiedValue = StringUtils.replace(encodedComment, "\\", "\\u");
//此处也可以自己写方法来进行转码
return UnicodeUtil.toString(modifiedValue);
}
}