SQL Server 使用 FileStream存储图片文件等BLOB资料

前言:

我们常用 SQL Server varbinary(max)类型字段存储文件、照片、影像等二进制位大型类型(BLOB),这种方法的
优点是:
  1、保证大对象的事务一致性。
  2、备份与还原包括大数据对象,可以对它进行时点恢复。
  3、数据统一使用一种存储与查询环境。
但也存在缺点:
1.单个最大只能是2G的资料;
2.资料如果太多将影响性能,大型对象在缓存中占非常大的缓存区
3.更新大型对象时会产生较大的数据碎片。
4.数据库文件可能变的非常大。

另外我们也常采用把文件存在磁盘上,而只在数据库表中存放文件地址的方法,但这种方法会增加系统的复杂度,因为需要去维护数据记录与文件地址的联系。

FileStream(文件资料流)

SQL Server 提供了 FileStream(文件资料流),将BLOB对象存储为磁盘文件,并自动管理数据库表与对应文件的联系。

一,何时考虑使用FileStream:

  1. 要存储的文件一般较大,例如超过1M;
  2. 文件可能大于2G;
  3. 考虑读取的性能;

二,FileStream 优点:

1.大型对象存储在文件系统中、数据库中只保存48字节的指针。
2.大型对象数据在事务中与结构数据保持一致。
3.大型对象可以通过 API 、T-SQL、NTFS流访问,从而提高性能。
4.大型对象只受NTFS卷大小限制、不受数据库LOB对象2GB限制。

三,怎么使用:

  1. 启用FileStream;
    在这里插入图片描述

  2. 指定存储等级(默认为0,即不使用,1 为只能使用T-SQL存取,2 为可以使用T-SQL和文件系统存取
    EXEC sp_configure filestream_access_level,2
    RECONFIGURE
    GO

  3. 在数据库
    1)新增文件组
    ALTER database Study
    add filegroup MyFileStreamGroup
    contains filestream

2)新增文件
ALTER database Study add file
(
Name = ‘Study_FileStream’,
FileName = ‘D:\Study_FileStream.ndf’
) TO filegroup MyFileStreamGroup

  1. 新建表(注意:varbinary(max) field 加上 filestream属性;要有 唯一字段
    CREATE TABLE FileTable
    (
    FileId varchar(50) not null,
    FileName varchar(100) not null,
    FileBlob varbinary(max) filestream null,
    uniqId uniqueidentifier rowguidcol not null unique
    )

–写入测试记录
INSERT INTO FileTable
VALUES(‘F1001’,‘TestTxt’,CAST(‘This is a filestream test’ as varbinary(max)),newid())

INSERT INTO FileTable
VALUES(‘F1002’,‘TestTxt1’,CAST(‘Hello word!!!’ as varbinary(max)),newid())

–将一个本地文件转为 varbinary存存储
INSERT INTO FileTable
VALUES(‘F1003’,‘IMG’,(SELECT *
FROM OPENROWSET(BULK ‘e:\p_w_picpath\photo\MadisonAVE.JPG’,
SINGLE_BLOB) AS x))

GO

结果:
在磁盘中可以看到 保存的文件,而数据表中对应的字段只保留48字节的指针。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值