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-кодировать изображения на проводе? Я думаю, что вы смотрите на неправильное предположение.