首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ojdbc6 7/ojdbc6 8中的字符集问题与ojdbc6中的正确行为

ojdbc6 7/ojdbc6 8中的字符集问题与ojdbc6中的正确行为
EN

Stack Overflow用户
提问于 2018-03-19 23:57:09
回答 2查看 5K关注 0票数 1

我们有一个具有以下字符集设置的Oracle数据库

选择参数,从nls_database_parameters值中选择'NLS%CHARACTERSET‘这样的参数

代码语言:javascript
复制
NLS_NCHAR_CHARACTERSET: AL16UTF16
NLS_CHARACTERSET: WE8ISO8859P15

在这个数据库中,我们有一个带有CLOB字段的表,其中有一个以以下字符串开头的记录,显然存储在ISO-8859-15中:X²ARB (这里正确地转换为unicode,特别是2-上标是重要的和正确的)。

然后,我们有以下一些代码来获取值,它应该通过Oracle中的全球化支持自动将字符集转换为unicode:

代码语言:javascript
复制
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.jarorai18n.jarX�ARB --不正确
  • 使用ojdbc7.jarorai18n.jarX�ARB --不正确
  • ojdbc-6.jarX²ARB -- 更正

通过使用UNISTR并将语句更改为SELECT UNISTR(data) FROM datatable d WHERE d.id=2562456,我可以使ojdbc7.jarojdbc8.jar返回正确的值,但这需要对代码进行数量未知的更改,因为这可能不是问题发生的唯一地方。

是否可以对客户端或服务器配置进行任何操作,使所有查询在不修改语句的情况下返回正确编码的值?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-21 10:48:03

它显然像是JDBC瘦驱动程序中的一个bug (我假设您使用的是thin)。它可能与LOB预取有关,其中CLOB的长度、字符集id和LOB数据的第一部分被发送到带内。这一特性是在11.2中引入的。作为解决办法,可以通过设置connection属性来禁用lob预取。

oracle.jdbc.defaultLobPrefetchSize

到"-1“。同时,我将跟踪这个bug,以确保它被修复。

票数 3
EN

Stack Overflow用户

发布于 2018-03-20 07:59:24

请看一下数据库JDBC开发人员指南-全球化支持

基本Java Archive (JAR)文件ojdbc7.jar包含所有必要的类,以便为以下方面提供完全的全球化支持:

  • 对象和字符集的CHARVARCHAR数据成员( US7ASCIIWE8DECWE8ISO8859P1WE8MSWIN1252UTF8 )。

若要在对象或集合的CHARVARCHAR数据成员中使用任何其他字符集,必须在CLASSPATH环境变量中包括orai18n.jar:

ORACLE_HOME/jlib/orai18n.jar

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49374296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档