簡體   English   中英

MySQL - Base64 vs BLOB

[英]MySQL - Base64 vs BLOB

為簡單起見,假設我正在開發像Instagram這樣的移動應用程序。 用戶可以從服務器下載圖像,並上傳自己的圖像。 目前,服務器將所有圖像(實際上只是小縮略圖)存儲在MySQL數據庫中作為BLOB。 似乎最常見的傳輸圖像的方法是使用Base64編碼,這讓我有兩個選擇:

  1. 服務器將所有圖像存儲為BLOB。 要上傳圖像,客戶端將其編碼為Base64字符串,然后將其發送到服務器。 服務器將圖像BACK解碼為二進制格式,並將其作為BLOB存儲在數據庫中。 當客戶端請求圖像時,服務器將圖像重新編碼為Base64字符串並將其發送到客戶端,客戶端然后將其解碼回二進制以供顯示。
  2. 服務器將所有圖像存儲為Base64字符串。 要上傳映像,客戶端會將其編碼為Base64字符串並將其發送到服務器。 服務器不進行編碼或解碼,只是將字符串存儲在數據庫中。 當客戶端請求圖像時,Base64字符串將返回給客戶端,然后客戶端將其解碼以供顯示。

顯然,選項#1需要在服務器上進行更多的處理,因為必須對每個請求對圖像進行編碼/解碼。 這使我傾向於選項#2,但一些研究表明,在MySQL中存儲Base64字符串的效率遠低於將圖像直接存儲為BLOB,並且通常不鼓勵使用。

我當然不是第一個遇到這種情況的人,那么有沒有人就這項工作的最佳方式提出建議?

JSON假定為utf8,因此與圖像不兼容,除非它們以某種方式編碼。

Base64幾乎是二進制(BLOB)的8/6倍。 人們可以說它很容易負擔得起。 3000 bytes變為大約4000 bytes

每個人都應該能夠接受任意8位代碼,但不是每個人都能接受。 Base-64可能是最簡單和最全面的妥協,無需處理8位數據。

由於這些是“小”,我會將它們存儲在表中,而不是文件中。 但是,我會將它們存儲在一個單獨的表中,並在需要時通過適當的id JOIN 這允許不需要圖像的查詢運行得更快,因為它們沒有跨越BLOB。

從技術上講, TEXT CHARACTER SET ascii COLLATE ascii_bin會這樣做,但BLOB更清楚地表明列中沒有任何可用的文本。

為什么要對線上的圖像進行64位編碼? 我認為你是從一個錯誤的假設開始的。

我不明白為什么數據庫服務器不應該總是以它的本機形式保存二進制數據。 因此,使用BLOB。 (但即使您確實將數據存儲在Base64字符串中,也不必擔心編碼/解碼性能,因為IO的影響會更大。)

我不明白為什么客戶端應該在base64中發送數據。 為什么不使用簡單的HTTP調用“流”它呢?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM