Loading

DataX 常见问题及解决方式

1. 同步到 PG 出现 invalid byte sequence for encoding "UTF8": 0x00

invalid byte sequence for encoding "UTF8": 0x00(注意:若不是 0x00 则很可能是字符集设置有误),是 PostgreSQL 独有的错误信息,直接原因是 varchar 型的字段或变量不接受含有 '\0'(也即数值 0x00UTF 编码 '\u0000')的字符串 。官方给出的解决方法:事先去掉字符串中的 '\0',例如在 Java 代码中使用 str.replaceAll('\u0000', ''),貌似这是目前唯一可行的方法。
具体方法:

// com.alibaba.datax.plugin.writer.postgresqlwriter.PostgresqlWriter.Task#commonRdbmsWriterSlave

this.commonRdbmsWriterSlave = new CommonRdbmsWriter.Task(DATABASE_TYPE){
    @Override
    public String calcValueHolder(String columnType){
        ...
    }

    @Override
    protected PreparedStatement fillPreparedStatementColumnType(PreparedStatement preparedStatement, int columnIndex, int columnSqltype, String typeName, Column column) throws SQLException {

        if (columnSqltype == Types.CHAR || columnSqltype == Types.VARCHAR) {
            String value = column.asString();
            if (value != null) {
                preparedStatement.setString(columnIndex + 1, value.replaceAll("\u0000", ""));
                return preparedStatement;							
            }
        }

        return super.fillPreparedStatementColumnType(preparedStatement, columnIndex, columnSqltype, typeName, column);
    }
};

参考:"从Microsoft SQL Server同步数据到AnalyticDB for PostgreSQL提示org.postgresql.util.PSQLException ERROR invalid byte sequence for encoding ""UTF8"" 0x00"-阿里云帮助中心_-阿里云帮助中心

posted @ 2024-07-30 17:04  kingron  阅读(94)  评论(0编辑  收藏  举报