【问题标题】:Pictures in SQL DBSQL DB 中的图片
【发布时间】:2009-09-12 20:09:38
【问题描述】:

如果我想在 SQL 数据库中存储相机拍摄的照片,我应该在 SQL 数据库中创建多大(二进制(xy))的表列 - 这意味着可变大小高达..我不知道.. 7MB?但如果我宁愿将大小限制为 2MB 或其他东西,我会的。你有什么意见?

编辑

或者我应该将它们存放在哪里?我正在使用 asp.net mvc 构建一个网络画廊。

【问题讨论】:

  • 你在运行什么数据库服务器?
  • 目前是 VS2008。我打算使用 SQL Server 2008 Express。
  • 我知道你问的不是这个,但如果我不提这个我会很难过。这是一个非常主观的话题,但我发现将图像存储在数据库中很糟糕。恕我直言,唯一的优点是您可以将数据库和图像中的数据一起备份和移动,但除此之外,我觉得这会使事情变得过于复杂。您需要自定义代码来加注和检索,很难手动进行更改,通常数据库空间很昂贵等......您可能有充分的理由想要这个,但要考虑一下。
  • 完全同意,让文件系统/操作系统处理文件,而不是 sql 数据库。仅将文件名保存在数据库中,以便以后生成它的路径。文件名的 varchar 应该可以做到这一点。
  • 嗯,我的主要原因是我真的不知道在哪里可以存储它们。我对此很陌生。另外,我发现数据库代码操作很容易。

标签: sql sql-server tsql image sql-server-2008


【解决方案1】:

您所说的是varbinary 列。当然,如果你让varbinary大于8000,它会立即将其转换为varbinary(max)列,这意味着它最多可以存储2GB。这与 SQL Server 如何存储行(每页 8k)有关。

因此,无论如何,每一行都将列存储为指向位的指针。所以,如果我是我,我会做的是将图像存储在文件系统上,并将这些文件的位置存储在数据库中。

【讨论】:

    【解决方案2】:

    如果您想在 SQL Server 中存储图像,请使用 varbinary(max) 列类型。它允许高达 2Gb(如果我记得的话)。

    另外,由于您使用的是 SQL Server 2008(我不知道速成版),您可以使用新的 filestream 数据类型。

    当然,将其存储在数据库中的一大优势是您只需备份一件事,并且不会出现文件系统和数据库不同步的问题。新的文件流类型是一个有趣的发展,因为它可以帮助缓解这些问题。

    将这些数据存储在数据库中的缺点是会给数据库带来额外的压力,尤其是在数据库和网络服务器之间的带宽已经紧张的情况下。

    【讨论】:

    • 虽然这个 FILESTREAM 真的很酷,但它对备份和特别恢复之类的东西造成了严重破坏:如果你使用它,你将永远无法回到特定的时间点。
    • 那么,事实证明它更多的是阻碍而不是帮助?但是,仅手动将文件存储在文件系统中会出现数据同步问题,尤其是备份/恢复问题。
    【解决方案3】:

    正如其他人已经在 cmets 中所说的那样(顺便说一句,尽管有悬而未决的警察,你们应该是答案)你真的必须有一些杀手级的理由才能将图像存储在数据库中。否则,只需将它们放在文件系统中即可。

    尤其是在图像从网络服务器传送的情况下更是如此。与您的代码从数据库中提取图像相比,Web 服务器从文件系统传递图像的效率要高得多。

    【讨论】:

      猜你喜欢
      • 2017-03-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多