MySQL - Base64 vs BLOB

问题描述 投票:16回答:3

为简单起见,假设我正在开发像Instagram这样的移动应用程序。用户可以从服务器下载图像,并上传自己的图像。目前,服务器将所有图像(实际上只是小缩略图)存储在MySQL数据库中作为BLOB。似乎最常见的传输图像的方法是使用Base64编码,这让我有两个选择:

  1. 服务器将所有图像存储为BLOB。要上传图像,客户端将其编码为Base64字符串,然后将其发送到服务器。服务器将图像BACK解码为二进制格式,并将其作为BLOB存储在数据库中。当客户端请求图像时,服务器将图像重新编码为Base64字符串并将其发送到客户端,客户端然后将其解码回二进制以供显示。
  2. 服务器将所有图像存储为Base64字符串。要上传映像,客户端会将其编码为Base64字符串并将其发送到服务器。服务器不进行编码或解码,只是将字符串存储在数据库中。当客户端请求图像时,Base64字符串将返回给客户端,然后客户端将其解码以供显示。

显然,选项#1需要在服务器上进行更多的处理,因为必须对每个请求对图像进行编码/解码。这使我倾向于选项#2,但一些研究表明,在MySQL中存储Base64字符串的效率远低于将图像直接存储为BLOB,并且通常不鼓励使用。

我当然不是第一个遇到这种情况的人,那么有没有人就这项工作的最佳方式提出建议?

mysql json encoding base64 blob
3个回答
6
投票

JSON假定为utf8,因此与图像不兼容,除非它们以某种方式编码。

Base64几乎是二进制(BLOB)的8/6倍。人们可以说它很容易负担得起。 3000 bytes成为约4000 bytes

每个人都应该能够接受任意8位代码,但不是每个人都能接受。 Base-64可能是最简单和最全面的妥协,无需处理8位数据。

由于这些是“小”,我会将它们存储在表中,而不是文件中。然而,当你需要它时,我会将它们存放在一个单独的表格中,然后用恰当的JOIN存放。这允许不需要图像的查询运行得更快,因为它们没有跨越BLOB。

从技术上讲,id会这样做,但是TEXT CHARACTER SET ascii COLLATE ascii_bin更清楚地表明专栏中没有任何可用的文字。


1
投票

为什么要对线上的图像进行64位编码?我认为你是从一个错误的假设开始的。


0
投票

我不明白为什么数据库服务器不应该总是以它的本机形式保存二进制数据。因此,使用BLOB。 (但即使您确实将数据存储在Base64字符串中,也不必担心编码/解码性能,因为IO的影响会更大。)

我不明白为什么客户端应该在base64中发送数据。为什么不使用简单的HTTP调用“流”它呢?

© www.soinside.com 2019 - 2024. All rights reserved.