Java Postgresql/JDBC在使用或不使用UTF8编码时失败
使用Java 8和Postgres 10服务器,以及v 42.2.16 Postgresql驱动程序, 我有一个基本的JDBC查询功能: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>>
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;