Mysql读取blob案例:



/**
  * 连接mysql查询blob类型的字段测试
  * tab为blob类型数据:注意要根据数据库的编码转为编码不然读出来的数据是不对的。
  * 2:读取blob时需要从第一个字节开始获取字节
  * 测试结果:tab:中国 ==========
  */
 public void getStringByBlob() throws Exception {
  Connection conn = DBUtil.getConnection();
  Statement stmt = conn.createStatement();
  ResultSet rs = stmt.executeQuery("select tab from tab");
  while (rs.next()) {
   Blob result = rs.getBlob("tab");
   System.out.println(result);//看不明白啥东西不管
   System.out.println(result.length() + "====");//6个字节,汉字utf-8一个字3个字节
   if (result != null) {
//    getBytes解释
//    pos the ordinal position of the first byte in the BLOB value to be extracted; the first byte is at position 1
//    length the number of consecutive bytes to be copied; the value for length must be 0 or greater
    byte[] b = result.getBytes(1, (int) result.length());
    String rr = new String(b, "utf-8");
    System.out.println(rr);//中国
   }
  }
 }



sqlserver2008读取Image类型数据

// @Ignore
 @Test
 /**
  * sqlserver2008的image读取
  * 由于sqlserver默认的排序规则指定的是gbk编码所以下面编码转换必须用gbk,否则汉字读不出来,其他字符也会读错,
  * 因为不同的编码字符和汉字占得字节都不是一样的。
  * 测试数据:中国,中国  tab是image类型 name是varchar类型
  */
 public void getStringByImage() throws Exception{
  Connection conn = DBUtil.getConnection();
  Statement stmt = conn.createStatement();
  ResultSet rs = stmt.executeQuery("select tab,name from tab");
  while(rs.next()){
   System.out.println("---" + rs.getString("name"));//中国
   byte[] b = rs.getBytes("tab");
   String rr = new String(b,"gbk");
   System.out.println(rr + "==");//中国
  }
 }


         通过以上两个测试总结如下。

解释:存储在mysql中的数据当时是以utf-8的编码存储,字符串存为blob时需要转换为二进制,这个时候它以utf8进行编码,所以存进去的二进制是经过utf-8编码后的二进制字符串,如果通过代码查询的话查到的blob字段将是utf8格式的二进制,所以要转换为正确的字符串需要通过new String进行utf8解码,才能看到汉字。但是我们通过工具导出sql语句时blob字段是可以导出汉字的这是为什么呢?(我的理解是工具查询出来的是经过解码转换后的字符串而不是二进制字符串。这与sqlserver的image不一样,sqlserver的image类型通过工具查询出来的是没有经过编码转换的16进制字符串所以不能显示汉字)。

    注意:其实blob的读取方式也可以用getBytes直接读取,及可以使用读取sqlserver的image字段同样的方式读取blob类型数据。只是需要注意各个数据库的编码,这样兼容起来就方便多了。

          此处提示:汉字字符串存入mysql用mysql工具查询出来的blob字段数据显示正常(可以看到汉字),二汉字存入sqlserver中的image字段中,看到的是十六进制数据,不能看到汉字。







当然提醒大家一点这种数据迁移方式不是好方式哦。一般不会用备份sql语句的方式去迁移数据库。不过上面这个问题我觉得还是有点价值。


sqlserver退出varbinary(max)准备替换掉image字段,这两者大体相同都是以二进制进行存储,但是也有不同如:

1:varbinary不能直接存入字符串,需要转换为二进制再存储,而image可以直接存字符串。

2:微软提供的mysql和sqlserver2008数据库迁移工具,blob字段对应的是varbinary而不能对应image字段。