MySQL - Base64 vs BLOB

时间:2015-03-26 16:47:44

标签: mysql json encoding base64 blob

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

  1. 服务器将所有图像存储为BLOB。要上传图像,客户端将其编码为Base64字符串,然后将其发送到服务器。服务器将图像BACK解码为二进制格式,并将其作为BLOB存储在数据库中。当客户端请求图像时,服务器将图像重新编码为Base64字符串并将其发送给客户端,然后客户端将其解码回二进制文件以供显示。
  2. 服务器将所有图像存储为Base64字符串。要上传映像,客户端会将其编码为Base64字符串并将其发送到服务器。服务器不进行编码或解码,只是将字符串存储在数据库中。当客户端请求图像时,Base64字符串将返回给客户端,然后客户端对其进行解码以供显示。
  3. 显然,选项#1需要在服务器上进行更多处理,因为必须使用每个请求对图像进行编码/解码。这使我倾向于选项#2,但一些研究表明,在MySQL中存储Base64字符串的效率远低于将图像直接存储为BLOB,并且通常不鼓励。

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

3 个答案:

答案 0 :(得分:6)

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

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

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

由于这些是"小",我会将它们存储在一个表中,而不是一个文件中。但是,我会将它们存储在单独的表格中,并在需要时将JOIN存储在适当的id中。这使得不需要图像的查询运行得更快,因为它们没有跨越BLOB。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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