我在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)
答案 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客户端软件包一起提供,将是一个很好的选择。
你(好吧,不是你,但大型机系统程序员)也可以配置数据库(子系统)的默认编码方案。