如何从Firebird恢复未知类型的BLOB字段

时间:2013-03-27 09:23:06

标签: blob firebird compression

我正在尝试恢复存储在Firebird数据库中的BLOB字段,我唯一的信息是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);
            }

        }

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

1 个答案:

答案 0 :(得分:1)

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

因此,归结为将文档存储到DB中的程序,它很可能是压缩或加密文件,但Firebird无法帮助您找出使用的算法...一个选项将BLOB的内容保存到文件中,然后尝试* nix file命令,也许它能够检测使用的文件格式。

我还会检查数据库是否存在损坏,仅用于案例(Firebird的gfix命令行工具)。