我们有一个具有以下字符集设置的Oracle数据库
选择参数,从nls_database_parameters值中选择'NLS%CHARACTERSET‘这样的参数
NLS_NCHAR_CHARACTERSET: AL16UTF16
NLS_CHARACTERSET: WE8ISO8859P15在这个数据库中,我们有一个带有CLOB字段的表,其中有一个以以下字符串开头的记录,显然存储在ISO-8859-15中:X²ARB (这里正确地转换为unicode,特别是2-上标是重要的和正确的)。
然后,我们有以下一些代码来获取值,它应该通过Oracle中的全球化支持自动将字符集转换为unicode:
private static final String STATEMENT = "SELECT data FROM datatable d WHERE d.id=2562456";
public static void main(String[] args) throws Exception {
Class.forName("oracle.jdbc.driver.OracleDriver");
try (Connection conn = DriverManager.getConnection(DB_URL);
ResultSet rs = conn.createStatement().executeQuery(STATEMENT))
{
if (rs.next()) {
System.out.println(rs.getString(1).substring(0, 5));
}
}
}运行代码打印:
ojdbc8.jar和orai18n.jar:X�ARB --不正确ojdbc7.jar和orai18n.jar:X�ARB --不正确ojdbc-6.jar:X²ARB -- 更正通过使用UNISTR并将语句更改为SELECT UNISTR(data) FROM datatable d WHERE d.id=2562456,我可以使ojdbc7.jar和ojdbc8.jar返回正确的值,但这需要对代码进行数量未知的更改,因为这可能不是问题发生的唯一地方。
是否可以对客户端或服务器配置进行任何操作,使所有查询在不修改语句的情况下返回正确编码的值?
发布于 2018-03-21 10:48:03
它显然像是JDBC瘦驱动程序中的一个bug (我假设您使用的是thin)。它可能与LOB预取有关,其中CLOB的长度、字符集id和LOB数据的第一部分被发送到带内。这一特性是在11.2中引入的。作为解决办法,可以通过设置connection属性来禁用lob预取。
oracle.jdbc.defaultLobPrefetchSize
到"-1“。同时,我将跟踪这个bug,以确保它被修复。
发布于 2018-03-20 07:59:24
基本Java Archive (JAR)文件ojdbc7.jar包含所有必要的类,以便为以下方面提供完全的全球化支持:
CHAR或VARCHAR数据成员( US7ASCII、WE8DEC、WE8ISO8859P1、WE8MSWIN1252和UTF8 )。若要在对象或集合的CHAR或VARCHAR数据成员中使用任何其他字符集,必须在CLASSPATH环境变量中包括orai18n.jar:
ORACLE_HOME/jlib/orai18n.jar
https://stackoverflow.com/questions/49374296
复制相似问题