直接在数据库中存储图像还是作为base64数据存储?

时间:2012-03-15 15:10:37

标签: mysql database image imagemagick base64

在数据库中存储图像的常用方法是在存储数据之前将图像转换为base64数据。此过程将使尺寸增加33%。或者,可以将图像直接存储为BLOB;例如:

$image = new Imagick("image.jpg");
$data = $image->getImageBlob();
$data = $mysqli->real_escape_string($data);
$mysqli->query("INSERT INTO images (data) VALUES ('$data')");

然后使用

显示图像
<img src="data:image/jpeg;base64,' .  base64_encode($data)  . '" />

使用后一种方法,我们可以节省1/3的存储空间。为什么在MySQL数据库中将图像存储为base64更为常见?

更新:关于在数据库中存储图像的优缺点有很多争论,大多数人认为这不是一种实用的方法。无论如何,在这里我假设我们将图像存储在数据库中,并讨论了这样做的最佳方法。

5 个答案:

答案 0 :(得分:58)

  • Pro base64:您处理的编码表示是一个非常安全的字符串。它既不包含控制字符也不包含引号。后一点有助于防止SQL注入尝试。我不希望任何问题只是将值添加到“手动编码”SQL查询字符串。

  • Pro BLOB:数据库管理器软件知道它所期望的数据类型。它可以优化它。如果你将base64存储在一个TEXT字段中,它可能会尝试为它构建一些索引或其他数据结构,这对于“真正的”文本数据来说非常好用,但是没有意义,浪费了图像数据的时间和空间。它是较小的,如字节数,表示。

答案 1 :(得分:54)

我认为图像(文件)通常不存储在base64编码的数据库中。相反,它们以二进制(blob)列(或文件)的原始二进制形式存储。

Base64仅用作传输机制,不用于存储。例如,您可以将base64编码的图像嵌入到XML文档或电子邮件中。

Base64也是流友好的。您可以动态编码和解码(不知道数据的总大小)。

虽然base64适合传输,但不会存储您的图像base64编码

Base64不提供校验和或任何存储值。

与原始二进制格式相比,Base64编码将存储要求提高了33%。它还增加了必须从持久存储中读取的数据量,这通常仍然是计算中最大的瓶颈。读取较少的字节并在运行中对它们进行编码通常会更快。只有当你的系统是CPU绑定而不是IO绑定时,并且你经常在base64中输出图像,那么考虑存储在base64中。

内嵌图像(嵌入在HTML中的base64编码图像)本身就是一个瓶颈 - 你通过网络发送了33%以上的数据,并且连续执行(网络浏览器必须等待内嵌图像才能完成下载页面HTML)。

如果您仍希望存储base64编码的图像,请不要这样做,请确保您不将base64编码数据存储在UTF8列中,然后将其编入索引。

答案 2 :(得分:3)

仅举一个例子,为什么我们决定将图像存储在DB中而不是文件或CDN中,而是存储签名图像。

我们尝试通过CDN,云存储,文件来实现,最后决定存储在数据库中,并对这一决定感到高兴,因为在随后的活动中,当我们移动,升级脚本和迁移网站时证明我们是正确的服务器时间。

对于我来说,我们希望签名与属于文档作者的记录一起出现。

以文件格式存储可能会丢失或意外删除文件。

我们将其以blob二进制格式存储在MySQL中,然后作为基于64位编码的图像存储在文本字段中。决定更改为based64的原因是由于某种原因导致尺寸较小,并且加载速度更快。由于某种原因,Blob正在减慢页面加载速度。

在我们的案例中,这种将签名图像存储在DB(无论是blob还是based64)的解决方案是由以下因素驱动的:

  1. 大多数签名图像非常小。
  2. 我们不需要索引存储在数据库中的签名图像。
  3. 索引是在主键上完成的。
  4. 我们可能必须移动或切换服务器,将物理图像文件移动到其他服务器,可能会由于链接更改而导致找不到图像。
  5. 不好意思要求作者重新签名。
  6. 与将其公开为文件(如果安全受到威胁时可以下载)相比,可以更安全地保存在数据库中。存储在数据库中使我们可以更好地控制对其的访问。
  7. 任何将来的迁移,Web设计,托管,服务器的更改,我们对将签名文件名与物理文件进行调和的担忧都为零,这一切都在数据库中!

AC

答案 3 :(得分:0)

我建议查看像NoSQL这样的现代数据库,我同意 user1252434 的帖子。例如,我存储了一些&lt;在我的Mongo数据库上将500kb PNG作为base64,二进制设置为true,完全没有性能损失。 Mongo可用于存储大型文件,如10MB视频,并且可以为这些视频的元数据搜索提供巨大的时间节省优势,请参阅storing large objects and files in mongodb

答案 4 :(得分:0)

我听到了 Facebook 工程师关于数据库中 Efficient Storage of Billions of Photos 的精彩演讲