Jfinal使用ICallback调用存储过程,返回的结果集字符编码乱码的问题

想在jfinal调用存储过程,代码如下:

Db.execute(new ICallback() {

public Object call(Connection conn) throws SQLException {

List<TBItemLibrary> itemTree = new ArrayList<TBItemLibrary>();

Object[] objs = null;

TBItemLibrary item = null;

String sql = "call get_item_library_tree_proc(?,?)";

CallableStatement cstmt = conn.prepareCall(sql);

cstmt.setString(1, item_library_id);

cstmt.registerOutParameter(2,OracleTypes.ARRAY,"TYPE_ITEM_LIST");

cstmt.execute();

Object[] obj = (Object[])cstmt.getArray(2).getArray();

if(null != obj){

for(Object o:obj){

objs = ((STRUCT)o).getAttributes();

item = new TBItemLibrary();

                                                //此处打印返回结果集的其中一个字段的字符结果

                                                System.out.println((String)objs[0]);

item.setId((String)objs[0]);

item.setName((String)objs[1]);

item.setDepth((BigDecimal)objs[2]);

item.setIsDelete((String)objs[3]);

item.setCreator((String)objs[6]);

item.setUpdator((String)objs[7]);

item.setIsScoring((String)objs[8]);

item.setLibDefId((String)objs[9]);

item.setDepthDefId((String)objs[10]);

itemTree.add(item);

}

return itemTree;

}

});

在后台打印出来的结果:

???

???

???

???

???

???

???

???

???

???

返回的结果集里面,关于字符类型varchar2的无论中英文都是3个?,如上所示。时间类型date和整型没有出现问题,只是上面实例没打印出来。数据库的字符集是GBK

查询资料后怀疑是jdbc处理结果字符集有问题,但是jfinal自己的activeRecord查询是没问题的。请问出现这个问题的原因是什么呢?jfinal有没有好的解决办法?

评论区

zengjun

2018-01-10 14:49

lyh061619

2018-01-10 15:38

查询下统一字符集如:utf-8,现在还有部分现喜欢数据库是GB2312或GBK,项目默认是ISO8859-1或什么的,然后就各种乱码都出来了。

zengjun

2018-01-10 17:19

@lyh061619
数据从jdbc的接口获取数据就出现问题了,要么改数据库字符集,要么改jdbc处理的字符集。改数据库的字符集是不可能的,因为影响到其他用户。如果修改jdbc接口的字符集,mysql数据库是可以在数据库url上指定jdbc接口的字符集的,类似URL=jdbc:mysql://127.0.0.1:3306/dslztx?useUnicode=true&characterEncoding=gbk。但是oracle数据库不行,纳闷,而且jfinal自带的activeRecord没问题

lyh061619

2018-01-10 22:08

@zengjun mysql库与oracle库一同,这么配置肯定不行的,oracle库本身也是比较麻烦,建议你看下这:http://bbs.csdn.net/topics/392080267,在这一两句也说不清楚的。

zengjun

2018-01-12 16:18

@lyh061619
完美解决了,不是字符集的问题,是jdbc驱动的问题,oracle后来发布的jdbc包提供了一个jar解决这个问题,包名是orai18n.jar,详情可以参考http://forever-8601.iteye.com/blog/1922885

热门反馈

扫码入社