什么是BLOB

首先,我们来比较两种文件类型ASCII和二进制。存储在sql server中的大部分数据值都是由ASCII(美国信息交换标准代码)字符组成。简单说来,ASCII字符就是能够在计算机键盘上找到的字母、数字和符号。我们可以通过记事本等文本编辑器对只包含了ASCII字符的文件进行修改且不会对文件造成任何破坏。而二进制文件,不仅包含了ASCII字符,还包含了键盘上没有的特殊控制字符和字节组合。如果你用记事本打开一个MP3文件,并删除其中的一些字符企图使歌曲变短,很可能会破坏掉整个文件,导致该MP3不能再正常播放,这是因为记事本只能用来编辑ASCII字符,而无法正确解析或创建二进制位。其他二进制数据包括图像和可执行文件汇编程序。BLOB顾名思义就是大型的二进制文件。

为什么要在SQL Server存储BLOB

有人喜欢在SQL server数据库里存储二进制对象,也有人反对这样做,正所谓公说公有理,婆说婆有理。我们应当两方面都考虑周全。举一个看起来比较真实的例子,假设我们在一个典型的销售企业当数据库管理员。这个企业通常有很多待售的产品线,包含不同类别的产品,而产品线以下的水平就是单个产品或部件,我们把他们称之为构件。对于每个构件,都提供了标准的详细目录清单,如价格、成本、现有数量、供应商等等。此外,很多构件可能还有用来描述该构件销售手册或宣传册,这些宣传册往往以PDF、幻灯片或某种类型的图像等电子文档形式出现。处理这些电子文档的一个方法就是把他们都放入一个文件服务器,并为每个构件创建一个目录。这个一开始可能管用,不过当客户或雇员想要设计一个可以调用这些文档的应用程序,只需要输入搜索参数就可以让数据库返回匹配的销售手册时,问题就来了。例如,输入“显示所有售价低于100元的蓝色构件的文档”。这时,就会涉及到将应用程序与数据库绑定的问题了。因此,在这个系列文章的后半部分,我们会创建一个连接到SQL Server的Visual Studio应用程序来检索构件销售手册。

文件存储位置

第一个需要解决的问题是要将这些电子宣传小册子存放在哪里。我们可以用一个应用程序来存储导向该文档的文件系统路径信息,例如“e:"sales "widgeta-picture.jpg”,将这些信息存放在varchar类型的数据列里,而把实际的文档保留在文件系统;也可以将实际的图像文件直接放在一个二进制或图像类型的数据列里。回答下面几个重要问题将有助于确定最佳的选择方案:

· 性能:这些二进制对象对性能要求是不是很高,如视频流?如果是的话,保留在文件系统会比用二进制流文件存储要好。

· 大小:需要检索的二进制对象是不是很大?有没有超过1MB?如果对象很大,那么用文件系统来显示和读取该对象的效率往往比从SQL Server显示和读取的效率更高。如果二进制对象比较小,也就是说每个构件只有很小的图像文件,那么将它们存储在SQL server内则绰绰有余。

· 安全:对这些二进制对象的访问是否要高度关注安全性。如果这些对象存储在SQL Server中,那么可以通过常规的数据库访问方式来管理其安全性。如果文件存储在文件系统,那么就需要另外设置更安全的替代管理办法了。

· 客户访问:客户对数据库的访问通过什么方式,是通过ODBC还是Native sql Drive?对于大型视频流,以ODBC方式连接的客户可能出现连接超时和连接失败的问题。

· 碎片:如果要对这些二进制对象进行频繁的修改操作,或者这些文件很大,那么文件系统处理碎片的能力可能比SQL Server更好。

· 事务:是否需要进行事务控制,如果需要,那么SQL Server可能更好,因为其具有内置解决方案。

如果您想更深入探讨这个关于将BLOB文件存储在数据库还是文件系统的问题,以及想知道上面提到的1MB大小标准的划分有什么依据,可以通过以下链接,参阅微软的技术文献:http://research.microsoft.com/research/pubs/view.aspx?msr_tr_id=MSR-TR-2006-45 .

数据类型

回到第一个例子,我们将要创建一个应用程序来存储各个产品的相关图片。因为这些文件都很小,所以我们会选择将它们直接存储在SQL Server里。在SQL server 2000中,有两种不同的数据类型选择类群用来存储这些文件类型:二进制和图像(Image)。二进制类群包括三种不同的数据类型。第一种就是标准二进制数据类型Binary,但其要求固定的数据长度。对于上面的例子,由于我们的图片大小不等,所以我们需要使用varbinary数据类型,这里的 “var”就是变量的意思。Varbinary数据类型的最大长度为8000字节。从SQL server 2005开始,“varbinary(max)”也包含在二进制数据类型的类群当中了。其关键词MAX就表示大小不限。如果SQL Server的版本是2005以前的,而数据长度又超过8000字节的话,就可以使用图像数据类型进行存储了。这种数据类型的文件大小可变,最大可存储 2GB的文件。虽然图像数据类型也包含在SQL server 2005和2008中,但在这些版本下不应当使用这种类型。微软称,还保留图像数据类型是未来向下兼容之需,在将来某个时候就会将其舍弃。因此,本例中将使用二进制数据类型,这个类群的三种类型扼要重述如下:
 Binary:文件大小固定,最大长度可达8000字节;

· VarBinary(n): 文件大小可变,最大长度可达8000字节,(n指明最大文件长度);

· VarBianry(max): 文件大小可变,不限最大长度。

总结

在本系列的下一篇文章当中,我们会继续探讨在SQL Server存储BLOB文件的问题,通过创建 Visual Studio应用程序来对SQL Server二进制数据类型进行读写操作。VarBinary(MAX)数据类型的使用技巧将在介绍SQL server 2008新的文件流数据类型选项后进行探讨。