2013-03-27 128 views
2

我想恢复存储在Firebird数据库中的BLOB字段,我唯一的信息是BLOB字段的内容是文档。如何从Firebird恢复未知类型的BLOB字段

我试过使用IBManager右键单击单元格并单击“将BLOB保存到文件”,但保存的文件是不可读的(就像它被加密了一样)。我试图用Microsoft Word,记事本,Adobe等打开它,但没有成功。我也尝试用WinRAR打开它(我认为它可能在被存储到数据库之前被压缩),但仍然没有。

有没有办法找出BLOB文件是否以及如何压缩以及如何恢复?

在此先感谢!

更新:

我已经转换了Firebird数据库到SQL和我使用下面的代码来提取未编码的BLOB文件:

  conn.Open(); 
     dr = comm.ExecuteReader(); 

     while (dr.Read()) 
     { 
      byte[] document_byte = null; 

      if (dr[1] != System.DBNull.Value) 
      { 
       document_byte = (byte[])dr[1]; 
      } 

      string subPath = "C:\\Documents\\" + dr[0] + "\\"; 
      System.IO.Directory.CreateDirectory(subPath); 

      if (document_byte != null) 
      { 
       System.IO.File.WriteAllBytes(subPath + "Document", document_byte); 
      } 

     } 

我如何调整我的代码来解码从BLOB文件Base64,因为我知道是Base64编码?

+0

你可以发布的前几个字节为十六进制(说10 - 20),也许有人认识到文件类型。 – 2013-03-27 16:50:33

+0

@MarkRotteveel 这是文件的第一个字节。 'eJztnQmATuX + X3/VMU + 872xmGPtgkpBlDAaTpcaSpRiUbEm2GTNjDIZU/mHqCimuypbrWrLeSJa6JIUSSt0oqaSuuu1XqIvcwvy/z1nmnPO + 5zzv4sxi7nn4zFmec37P8nv25bxHPog7tWprja/Iy9xKDrpa6CGX6p4dHJcvYok + xcEGrhYWFrJbx8DHoNAy1405vXYfTRjmcRJdqrinSLMwUHz' – user2214824 2013-03-28 08:26:40

+0

这看起来像一个base64编码给我。你有没有试过先解码它? – 2013-03-28 08:32:27

回答

1

除非该字段使用BLOB过滤器,否则数据按原样存储到数据库中,即Firebird不会以任何方式更改它。检查字段的定义,如果它具有SUB_TYPE 0(或binary),那么它是“普通”二进制数据,即Firebird不应用任何过滤器。甚至在该字段使用某种过滤器的情况下,除非过滤器代码中存在错误,否则在读取BLOB的内容时应该返回原始数据。

所以它归结为它存储在文档到数据库的程序,这是很可能的,它压缩或加密的文件,但没有办法火鸟可以帮助你找出使用什么算法...一个选项是将BLOB的内容保存到文件中,然后尝试* nix file命令,或许它能够检测到使用的文件格式。

我也会检查数据库的损坏情况,只是为了解案例(Firebird的gfix命令行工具)。

+0

我尝试了使用Windows工具的建议,但它无法识别该文件。无论如何感谢您的时间! – user2214824 2013-03-27 13:11:26