MySQL - Base64 против BLOB

Для простоты предположим, что я разрабатываю мобильное приложение, такое как Instagram. Пользователи могут загружать изображения с сервера и загружать собственные изображения. В настоящее время сервер хранит все изображения (в действительности, только небольшие миниатюры) в базе данных MySQL в виде BLOB. Похоже, что наиболее распространенным способом передачи изображений является использование кодировки Base64, которая оставляет меня с двумя вариантами:

  • Сервер сохраняет все изображения в виде BLOB. Чтобы загрузить изображение, клиент кодирует его в строку Base64, а затем отправляет его на сервер. Сервер декодирует изображение BACK в двоичном формате и сохраняет его как BLOB в базе данных. Когда клиент запрашивает изображение, сервер перекодирует изображение как строку Base64 и отправляет его клиенту, который затем декодирует его обратно в двоичный для отображения.
  • Сервер сохраняет все изображения как строки Base64. Чтобы загрузить изображение, клиент кодирует его в строку Base64 и отправляет его на сервер. Сервер не кодирует и не декодирует, а просто сохраняет строку в базе данных. Когда клиент запрашивает изображение, строка Base64 возвращается клиенту, который затем декодирует его для отображения.

Очевидно, что опция №1 требует значительно большей обработки на сервере, так как изображения должны быть закодированы/декодированы с помощью каждого отдельного запроса. Это заставляет меня склониться к варианту № 2, но некоторые исследования показали, что сохранение базы Base64 в MySQL намного менее эффективно, чем хранение изображения непосредственно в виде BLOB, и обычно не рекомендуется.

Я, конечно, не первый человек, столкнувшийся с этой ситуацией, и у кого-нибудь есть предложения по наилучшему способу сделать эту работу?

Ответ 1

JSON предполагает utf8, следовательно, несовместим с изображениями, если они не закодированы каким-либо образом.

Base64 почти точно 8/6 раз больше, чем двоичный (BLOB). Можно утверждать, что он легко доступен. 3000 bytes становится около 4000 bytes.

Каждый должен иметь возможность принимать произвольные 8-битные коды, но не все делают. Base-64 может быть самым простым и лучшим компромиссом для того, чтобы не иметь дело с 8-битными данными.

Так как они "маленькие", я бы сохранил их в таблице, а не в файле. Тем не менее я сохранил их в отдельной таблице и JOIN подходящим id, когда они вам понадобятся. Это позволяет запросам, которым не нужно, чтобы изображение выполнялось быстрее, потому что они не перешагивают через BLOB.

Технически, TEXT CHARACTER SET ascii COLLATE ascii_bin будет делать, но BLOB дает понять, что в столбце нет никакого полезного текста.

Ответ 2

Зачем вам base64-кодировать изображения на проводе? Я думаю, что вы смотрите на неправильное предположение.