【问题标题】:SQL Server 2008 R2 Varbinary Max SizeSQL Server 2008 R2 Varbinary 最大大小
【发布时间】:2012-08-22 23:51:45
【问题描述】:

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

varbinary [ ( n | ma​​x) ]

可变长度二进制数据。 n 可以是 1 到 8,000 之间的值。 ma​​x 表示最大存储大小为 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) 的字段,正如我所说,我无法更改为更大的值。

【问题讨论】:

  • 你是怎么尝试的?你能展示你用来做这个的代码和表的创建表结构吗?也没有nvarbinary这样的东西。
  • 对不起,我的意思是varbinary(max),我也添加了我使用的代码,非常感谢
  • 您是否检查了兼容模式设置?
  • @PabloRomeo 即使兼容 80 (SQL Server 2000),您也可以创建并正确填充 varbinary(max)。兼容性级别设置会影响某些语法和解析,但不会影响数据类型或实际 DML 操作。
  • 正如文档中明确指出的那样:要么指定 varbinary(n) 并给出高达 8000 的特定数字 - 更多是不可能的; 然后您将列或变量定义为varbinary(max),在这种情况下,它最多可以容纳 2 GB 的数据。

标签: sql-server sql-server-2008 sql-server-2008-r2 varbinary varbinarymax


【解决方案1】:

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

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() 是一种更好的方法。

【讨论】:

    【解决方案2】:

    我敢说,对大于 1 MB 的文件使用文件流,基于以下来源:MS TechNet | FILESTREAM Overview

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

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

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

    【讨论】:

      【解决方案3】:

      “SET TEXTSIZE”指定varchar(max)nvarchar(max)varbinary(max)textntextSELECT 语句返回的图像数据的大小。

      select @@TEXTSIZE
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-05
        相关资源
        最近更新 更多