问题描述
使用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一起使用。