【发布时间】:2021-05-26 10:21:04
【问题描述】:
在我们的应用服务器上,DevOps 团队在 Postgres (9.4) DB 中使用 SQL_ASCII 编码。
第 3 方应用程序正在将带有重音字符的姓氏插入到 Employee 表中,例如努涅斯
我的Java(8)应用程序是一个使用Mybatis(3.2.4)的Spring(4.3.15)WebApp
当我的应用程序从 SQL_ASCII 数据库中读取此类姓氏时,我得到:
org.postgresql.util.PSQLException:错误:编码“UTF8”的字节序列无效:0xe3 0xa1 0x54 在 org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2182) 在 org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1911) 在 org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:173) 在 org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:616) 在 org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:466) 在 org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:459) 在 org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:93) 在 org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:93) 在 jdk.internal.reflect.GeneratedMethodAccessor78.invoke(未知来源) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:55) 在 com.sun.proxy.$Proxy98.execute(未知来源)
如果我尝试通过以下方式更改 client_encoding:
SET client_encoding = 'SQL_ASCII';
然后我得到错误:
org.postgresql.util.PSQLException:服务器的 client_encoding 参数已更改为 LATIN1。 JDBC 驱动程序要求 client_encoding 为 UTF8 才能正确操作。 在 org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1950)
我怎样才能“安全地”从数据库中读取这些字符?
【问题讨论】:
标签: java postgresql utf-8