字符串编码问题导致SQL异常

最近在做图书馆管理系统时,测试导入许多MARC文件(可把它看成文本文件),没有问题,唯独有一个文件在导入过程中总是报错:
java.sql.BatchUpdateException: 批次处理0insert into...
org.hibernate.exception.DataException: Could not execute JDBC batch update
ERROR: invalid byte sequence for encoding "UTF8": 0x00

这是我所能看到的主要的异常信息。
很显然这是一个批次更新异常,但具体是怎么引起的呢,我不知道,网上说肯定是SQL有问题,但我操作的是EJB3.0的持久化包,SQL都是自动生成的,况且导入了那么多记录都成功了,为什么只在这里就有SQL异常呢?郁闷了好几天。后来又看到上面第三条信息:"UTF8"编码的无效的字节序列,是什么意思,难道是插入的某个字段编码有问题?但肯定是在入库时DB采用了UTF8编码。0x00是16进制的数据,相当于十进制的0,对应的byte类型的值也是0.结果也证明了确实是有个字段在插入数据库之前的编码转换出现了问题。准确地说,就是字符串中byte=0的那个字节有问题。于是当我把这个字符串打散成字节数组时,通过如下代码进行了矫正:
byte[] b = marcContent.getBytes();
   for (int i = 0; i < b.length; i++) {
      if (b[i] == 0)
	    b[i] = 32;// 如果字节数值为0,则替换为32(ASCII码,表示空格),否则可能会出现入库时的编码错误
    }

其中marcContent就是插入DB时编码有问题的字符串,最后重新构造这个字符串:
marcContent = new String(b);

重新导入这个MARC文件,一切正常!
至于为什么这条记录中为0的字节会导致入库时的SQL问题,我也不得其解,但是我也发现其他记录中同样为0的字节就不会出现这样的问题。
(第一次写出自己的问题,可能说得不太清楚,请见谅)

你可能感兴趣的:(sql,Hibernate,jdbc)