8

我可以在 SQL Server 2008 R2 中使用 varbinary(max) 插入的文件的最大大小是多少?我试图将列中的最大值更改为超过 8,000 字节,但它不会让我,所以我猜测最大值是 8,000 字节,但是从MSDN 上的这篇文章中,它说最大存储大小是 2 ^31-1 字节:

varbinary [ ( n | max ) ]

可变长度二进制数据。n 可以是 1 到 8,000 之间的值。max表示最大存储大小为 2^31-1 字节。存储大小是输入数据的实际长度 + 2 个字节。输入的数据长度可以是 0 字节。varbinary的 ANSI SQL 同义词是binary varying

那么如何将较大的文件存储在 varbinary 字段中?我不考虑使用 FILESTREAM,因为我要保存的文件最大为 200kb 到 1mb,我正在使用的代码:

UPDATE [table]
SET file = ( SELECT * FROM OPENROWSET ( BULK 'C:\A directory\A file.ext', SINGLE BLOB)    alias) 
WHERE idRow = 1

我已经能够成功地将该代码执行到小于或等于 8000 字节的文件。如果我尝试使用 8001 字节大小的文件,它将失败。我在表格上的文件字段有一个名为“文件”类型的字段varbinary(8000),正如我所说,我不能更改为更大的值。

4

3 回答 3

15

我无法重现这种情况。我尝试了以下方法:

USE tempdb;
GO

CREATE TABLE dbo.blob(col VARBINARY(MAX));

INSERT dbo.blob(col) SELECT NULL;

UPDATE dbo.blob 
  SET col = (SELECT BulkColumn 
    FROM OPENROWSET( BULK 'C:\Folder\File.docx', SINGLE_BLOB) alias
  );

SELECT DATALENGTH(col) FROM dbo.blob;

结果:

--------
39578

如果这被限制为 8K,那么我猜想以下任何一项都是正确的:

  1. 该列实际上是VARBINARY(8000).

  2. 您正在 Management Studio 中选择数据,并分析那里显示的数据的长度。这限制在文本结果中最多 8192 个字符,如果是这种情况,那么DATALENGTH()直接对列使用是一种更好的方法。

于 2012-08-23T00:15:14.377 回答
1

我敢说,根据以下内容对大于 1 MB 的文件使用文件流: MS TechNet | 文件流概述

在 SQL Server 中,BLOB 可以是将varbinary(max)数据存储在表中的标准数据,也可以是将数据FILESTREAM varbinary(max)存储在文件系统中的对象。数据的大小和用途决定了您应该使用数据库存储还是文件系统存储。如果满足以下条件,则应考虑使用FILESTREAM

  • 正在存储的对象平均大于 1 MB。
  • 快速读取访问很重要。
  • 您正在开发将中间层用于应用程序逻辑的应用程序。

对于较小的对象,将varbinary(max)BLOB 存储在数据库中通常可以提供更好的流式传输性能。

于 2012-08-28T02:37:50.280 回答
1

"SET TEXTSIZE" 指定语句返回的varchar(max)nvarchar(max)varbinary(max)textntext和图像数据的大小。SELECT

select @@TEXTSIZE

SQL Server Native Client ODBC 驱动程序和用于 SQL Server 的 SQL Server Native Client OLE DB ProviderTEXTSIZE在连接时自动设置为 2147483647。最大设置为SET TEXTSIZE2 GB,以字节为单位。设置为 0 会将大小重置为默认值 (4 KB)。

如前所述,对于大文件,您应该更喜欢文件流。

于 2013-09-08T05:12:53.840 回答