8

很久以前,我们购买了一个“现成的”应用程序,它能够在 SQL Server 中将文件存储为 blob。我们注意到,由于一个部门更频繁地使用此 blob 字段,数据库在过去六个月内增加了一倍多。结果,应用程序变得非常缓慢。

我的任务是从数据库中删除 blob 字段并将文件保存到实际的文件系统中。不幸的是,应用程序没有在数据库中存储文件类型。虽然我可以读取数据库中存在的文件,但我不知道将文件保存为什么扩展名。该应用程序的支持台不再支持该版本的软件,并且不会与我们讨论提取数据的问题。不幸的是,我们无权访问他们的源代码。

任何建议将不胜感激!提前致谢!

4

7 回答 7

7

您可以查看前几个字节并找出最常见的文件类型

http://www.garykessler.net/library/file_sigs.html

于 2009-06-16T22:11:50.503 回答
2

不要将其保存为任何类型。将其保存为没有扩展名的文件。如果您不知道它是什么,请不要伪造它。如果保存它的应用程序请求它,从文件系统返回它,就像从数据库返回它一样;作为二进制数据。数据库不关心二进制对象是什么类型的数据;你也不应该。

于 2009-06-16T22:12:32.153 回答
2

您可以尝试使用 TriD http://mark0.net/soft-trid-e.html

它将扫描文件并尝试确定扩展名。

于 2009-06-16T22:13:54.867 回答
1

您可以使用 UrlMon.dll 中的 FindMimeFromData() 函数(使用 pinvoke)。

有关示例,请参阅此页面,有关该函数的文档,请参阅此 MSDN 页面。

于 2009-06-16T22:16:20.493 回答
0

用你的话来说“......我的任务是......” - 你确定这不是一个可以通过对数据库执行一些优化来解决的问题吗?尽可能避免对没有源代码且没有支持的遗留应用程序进行黑客攻击。

所以,看看这里的问题 - 应用程序的缓慢。那为什么慢呢?数据库索引无法解决的问题?

如果您必须将 BLOB 提取到文件系统,那么为什么文件的格式是相关的?当然,该应用程序旨在对数据库进行查询以获取文件——将 BLOB 提取到文件系统对您有何帮助?

顺便说一句 - 我通常使用 Unixfile命令通过幻数识别文件。

于 2009-06-17T06:06:46.533 回答
0

你怎么知道这些信息是人类可读的?

文件扩展名的目的是关联特定软件以打开文件,以便当您双击 .txt 文件时,notepad.exe 会处理它。

如果您只是为了卸载数据库而将它们写入文件系统,那么不需要任何特定的扩展。如果要将软件与之关联,请使用适当的扩展名

于 2009-06-16T22:14:32.727 回答
0

另一种选择是对数据库进行物理分区。您可以将包含 blob 字段的表存储在不同的数据库文件中,该文件可以存储在不同的硬盘/主轴上。包含 blob 表的磁盘可以通过将其设置为 RAID 0 或 RAID 10 来进一步优化。

这可以加快速度。此外,这种方法无需更改应用程序逻辑。

于 2009-06-17T01:57:15.883 回答