nutzam/nutz — Issue #119: 为何从数据库里面取出二进制数据时会被转成String类型？
Author: elkan1788
Created: 2011-11-24 11:05:54+00:00
State: open

今天测试了Nutz+Postgresql对各种数据类型的存取情况，结果发现在处理二进制数据时出问题了。我在数据库表里面定义了一个bytea的二进制字段，sql脚本如下：

CREATE TABLE t_users
(
userid character varying(35) NOT NULL, -- 用户编号

account character varying(20), -- 登录名

pswd character varying(15), -- 密码

realname character varying(2), -- 真实姓名

sex character varying(2) DEFAULT '男'::character varying, -- 性别

birthday date, -- 出生日期

photo bytea, -- 头像

CONSTRAINT pk_t_users PRIMARY KEY (userid )
)

WITH

(

OIDS=FALSE

);

pojo的注解如下：
/**
* 用户信息表
* @author ELKAN
*/
@Table("t_users")
public class Users implements Serializable {
/**
* 头像
*/
@Column
private byte[] photo;
.
.
.
.
}

但在读取这字段的数据时发生以下错误：org.nutz.castor.FailToCastObjectException: Fail to cast '\x424db9695685.....' to ,because [java.lang.NumberFormatException: For input string: '\x424db9695685.....' 从错误提示来看是转换类型出错，我原以为是数据库里面的数据有问题，随即写了下面的原生JDBC代码读取该字段，代码执行正常，可以正确读取出数据。
String sql = "SELECT userid, account, pswd, photo, status FROM t_users WHERE userid = ?";
try {
PreparedStatement prstmt = dbcon.getConn().prepareStatement(sql);
prstmt.setString(1, "479Li8s70e9N9H3UI0757172079");
ResultSet rs = prstmt.executeQuery();
while(rs.next()){
System.out.println("userid:"+rs.getString("userid"));
System.out.println("account:"+rs.getString("account"));
System.out.println("pswd:"+rs.getString("pswd"));
byte[] img = rs.getBytes("photo");
System.out.println("photo:"+img);
System.out.println("status:"+rs.getBoolean("status"));
OutputStream os = new FileOutputStream(new File("c:/2.bmp"));
os.write(img, 0, img.length);
if(os!=null){
os.flush();
os.close();
}
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
}

为此我很是疑惑，不知是不是因为Nutz不支持bytea数据类型的原因？