Java Postgresql/JDBC在使用或不使用UTF8编码时失败

Java Postgresql/JDBC在使用或不使用UTF8编码时失败,java,postgresql,jdbc,encoding,Java,Postgresql,Jdbc,Encoding,使用Java 8和Postgres 10服务器,以及v 42.2.16 Postgresql驱动程序, 我有一个基本的JDBC查询功能: public List<Map<String, Object>> Query(String sql) throws Exception { Connection con = null ; PreparedStatement pstmt; List<Map<String, Object>>

使用Java 8和Postgres 10服务器,以及v 42.2.16 Postgresql驱动程序, 我有一个基本的JDBC查询功能:

public List<Map<String, Object>> Query(String sql) throws Exception {
    Connection con = null ;
    PreparedStatement pstmt;
    List<Map<String, Object>> resultSetToList = null;
    try {
        
        con = DriverManager.getConnection(ConnectionString, Properties);
        pstmt = con.prepareStatement( sql );
        pstmt.execute();
        
        ResultSet resultSet = pstmt.getResultSet();
        resultSetToList = resultSetToList(resultSet);

        pstmt.close();

    } catch(Exception e){
        throw e;
    }
        finally {
    
        if (con != null)
            con.close();
    }
    return resultSetToList;
}
但它抛出了一个例外

org.postgresql.util.PSQLException:错误:编码“UTF8”的字节序列无效:0xa3

数据库(由第三方提供)具有编码
SQL\u ASCII
。0xA3是“英镑”字符

因此,我将查询更改为:

SET LOCAL CLIENT_ENCODING TO 'SQL_ASCII'; SELECT * FROM bi_functions;
它失败于:

org.postgresql.util.PSQLException:服务器的客户端编码参数已更改为SQL\U ASCII。JDBC驱动程序要求客户端编码为UTF8才能正确运行


有没有办法使用普通JDBC来避免此错误?

Java在内部使用Unicode编码,因此您不能在JDBC驱动程序中使用与
UTF8
不同的
客户端编码

您应该了解数据库的实际编码(可能是ISO 8859或Windows编码之一)。然后使用该编码创建一个数据库,转储原始数据库并将转储的数据库加载到其中


否则,您将无法将此数据库与JDBC一起使用。

不,您不能这样做。有趣的问题是:服务器编码是什么,数据库中存储了哪些字节?DB(由第三方提供)具有编码SQL\U ASCII。0xA3是“英镑”字符。你是说我不能通过JDBC读取这个数据库吗?在第三方服务器上,数据库被列为编码SQL_ASCII;校勘英语国标;字符类型en_GB。是否有其他方法来确定“实际编码”?这是一个Windows服务器,所以可能是1252编码。如果我用这种编码在本地创建一个数据库,那么在通过JDBC查询它时不会遇到同样的问题吗?如果数据库中的所有数据都与Windows-1252一致,那么就不会有问题。如果没有(比如说,一些UTF-8数据已经潜入),您将不得不修复数据库中的数据。我正在Mac(Catalina)服务器上恢复数据库-这会有影响吗?不,平台不应该有影响。将备份恢复到使用编码创建的数据库='WIN1252'工作正常,谢谢
SET LOCAL CLIENT_ENCODING TO 'SQL_ASCII'; SELECT * FROM bi_functions;