最近在“玩”hibernate Annotation,弄了个Attachment保存进数据库的测试,附件内容保存在content属性里面。
@Lob
@Column(columnDefinition = "LongBlob")
public byte[] getContent() {
return content;
}
一开始,配置mysql jdbc url如下
jdbc.url = jdbc:mysql://localhost/test\
?useUnicode=true\
&characterEncoding=gbk
一测试,报错
Caused by: java.sql.BatchUpdateException: Syntax error or access violation message from server: "You have an error in your SQL syntax near ''D0CF11E0A1B11AE1000000000000000000000000000000003E000300FEFF0900060000000000000' at line 1"
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1540)
同样的语句,直接在mysql命令行下运行就没问题,偏偏jdbc上就有这臭毛病。换jdbc driver版本,改@Lob为 @Type(type = "org.springframework.orm.hibernate3.support.BlobByteArrayType"),改hibernate配置(比如hibernate.jdbc.use_streams_for_binary true),甚至是直接用jdbc来insert,乱七八糟折腾半天,问题照旧。最后只好用上“歪”招,把byte[]配成String,在保存的时候把byte[]保存成hex String格式,取的时候再解码回来。
歪招终归是歪招,这两天老为这东西心烦,晚上吃饭的时候无意中想起charset的问题,把代码捡回来再测试了一下,问题解决,哈哈!
jdbc.url = jdbc:mysql://localhost/mmwy_blog\
?useUnicode=true\
&characterEncoding=utf-8
如果设成iso-8859-1、utf-8,保存一点问题都没有,换用gbk、gb2312、big5之类的字符集,问题就出来了。