带有或不带有UTF8编码的Postgresql / JDBC都会失败

问题描述

使用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;
}

我执行这样的查询

Query("SELECT * FROM bi_functions");

但是会引发异常

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

数据库(由第三方提供)的编码为sql_ASCII。 0xA3是“英镑”字符。

因此我将查询更改为:

SET LOCAL CLIENT_ENCODING TO 'sql_ASCII'; SELECT * FROM bi_functions;

它失败并显示

org.postgresql.util.PsqlException:服务器的client_encoding参数已更改为sql_ASCII。 JDBC驱动程序要求client_encoding为UTF8才能正确操作。

是否可以使用普通JDBC 来避免此错误

解决方法

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...