UnsupportedCharsetException:带有DB2 JDBC驱动程序的Cp1027

时间:2016-04-01 11:13:00

标签: java jdbc character-encoding db2

我在JDBC客户端的大型机上创建一个类型为Timestamp的列的简单数据库表,如下所示 -

CREATE TABLE scma.timetest(
            T_TYPE VARCHAR(8),
            T_DATE TIMESTAMP
            );

如果我做了select * from scma.timetest;,有或没有插入任何记录我最终得到以下异常 -

java.nio.charset.UnsupportedCharsetException: Cp1027

如果我没有Timestamp类型列,一切正常。我试过用-Dfile.encoding=UTF-8启动JDBC客户端但没有用。我也尝试从Java程序中运行同样的错误。

这不是here提到的问题,我没有得到ClassNotFoundException。任何指针都可能出错。如果它有帮助,这是完整的例外 -

Exception in thread "main" java.nio.charset.UnsupportedCharsetException: Cp1027
    at java.nio.charset.Charset.forName(Charset.java:531)
    at com.ibm.db2.jcc.am.t.<init>(t.java:13)
    at com.ibm.db2.jcc.am.s.a(s.java:12)
    at com.ibm.db2.jcc.am.o.a(o.java:444)
    at com.ibm.db2.jcc.t4.cc.a(cc.java:2412)
    at com.ibm.db2.jcc.t4.cb.a(cb.java:3513)
    at com.ibm.db2.jcc.t4.cb.a(cb.java:2006)
    at com.ibm.db2.jcc.t4.cb.a(cb.java:1931)
    at com.ibm.db2.jcc.t4.cb.m(cb.java:765)
    at com.ibm.db2.jcc.t4.cb.i(cb.java:253)
    at com.ibm.db2.jcc.t4.cb.c(cb.java:55)
    at com.ibm.db2.jcc.t4.q.c(q.java:44)
    at com.ibm.db2.jcc.t4.rb.j(rb.java:147)
    at com.ibm.db2.jcc.am.mn.kb(mn.java:2107)
    at com.ibm.db2.jcc.am.mn.a(mn.java:3099)
    at com.ibm.db2.jcc.am.mn.a(mn.java:686)
    at com.ibm.db2.jcc.am.mn.executeQuery(mn.java:670)

1 个答案:

答案 0 :(得分:4)

从评论中移到这里:

旧版DB2 for z / OS通常对字符数据使用EBCDIC(也称为CP1027)编码。另外我相信DB2会将时间戳值作为字符串发送到客户端,尽管它们在内部以不同方式存储。我怀疑您使用的Java运行时不支持CP1027,因此它不知道如何将EBCDIC数据转换为客户端所需的任何数据。我无法解释为什么VARCHAR值可以通过OK。

有关DB2编码的更多详细信息,您可以check the manual

您可以强制DB2使用不同的编码创建表,Java可能会支持这些编码:

CREATE TABLE scma.timetest(...) CCSID UNICODE

另一种替代方法可能是使用支持EBCDIC(CP1027)编码的不同Java运行时。 IBM JDK与一些DB2客户端软件包一起提供,将是一个很好的选择。

你(好吧,不是你,但大型机系统程序员)也可以配置数据库(子系统)的默认编码方案。