2012-03-15 2 views
36

Обычный способ хранения изображений в базе данных состоит в том, чтобы преобразовать изображение в base64 данных перед сохранением данных. Этот процесс увеличит размер на 33%. В качестве альтернативы можно непосредственно сохранить изображение как BLOB; например:Хранение изображения в базе данных напрямую или как данные base64?

$image = new Imagick("image.jpg"); 
$data = $image->getImageBlob(); 
$data = $mysqli->real_escape_string($data); 
$mysqli->query("INSERT INTO images (data) VALUES ('$data')"); 

, а затем отобразить изображение с

<img src="data:image/jpeg;base64,' . base64_encode($data) . '" /> 

С последним способом, мы экономим 1/3 места для хранения. Почему в хранилищах MySQL хранятся изображения как base64?

ОБНОВЛЕНИЕ: Существует много дискуссий о преимуществах и недостатках хранения изображений в базах данных, и большинство людей считают, что это не практический подход. В любом случае, здесь я предполагаю, что мы храним изображение в базе данных и обсуждаем лучший способ сделать это.

+5

Сохраните данные в файл и сохраните только местоположение файла или URL-адрес в базе данных – Fredrik

+0

@Fredrik Если вы решили хранить данные в файле, почему в качестве данных base64? Мы можем просто сохранить исходный файл изображения. – Googlebot

+0

Я решил, что вы отправляете его с устройства, такого как iPhone или что-то еще. Затем вы не хотите отправлять необработанные данные, а base64 в JSON или что-то вместо этого. – Fredrik

ответ

42

Pro base64: кодированное представление, которое вы обрабатываете, является довольно безопасной строкой. Он не содержит ни контрольных символов, ни кавычек. Последнее указывает на попытки SQL-инъекций. Я бы не ожидал, что проблема просто добавит значение в строку запроса «вручную закодирована» SQL.

Pro BLOB: программное обеспечение менеджера баз данных знает, какой тип данных он должен ожидать. Он может оптимизировать для этого. Если вы сохранили base64 в поле TEXT, он может попытаться создать для него какую-то индексную структуру или другую структуру данных, что было бы очень полезно и полезно для «реальных» текстовых данных, но бессмысленно и тратить время и пространство на данные изображения. И это меньше, как в байтах, представление.

+0

very useful comparison. My worry is mainly about security. I am not sure if saving binary can open any security hole for SQL injection. – Googlebot

+0

That should depend on "proper" and "safe" handling of the data to the database. As I'm not familiar with PHP, what you seem to use, I can't give you tips on that. In java the tools I use (Hibernate/JPA) take care of that for me. :) – user1252434

+3

Escaping the input protects against SQL injection attacks, not the storage mechanism. I admit that I've never needed to enter an image by hand into a query. –

39

Я утверждаю, что изображения (файлы) обычно не хранятся в базе данных base64. Вместо этого они хранятся в их исходной двоичной форме в двоичном (blob) столбце (или файле).

Base64 используется только как транспортный механизм, а не для хранения. Например, вы можете вставлять изображение с кодировкой base64 в документ XML или сообщение электронной почты.

Base64 также удобен для потока. Вы можете кодировать и декодировать «на лету» (не зная общий размер данных).

В то время как base64 подходит для транспорта, не хранит ваши изображения base64 в кодировке.

Base64 не содержит никаких контрольных сумм или каких-либо значений для хранения.

Кодировка Base64 увеличивает требования к хранению на 33% по необработанному двоичному формату. Он также увеличивает объем данных, которые должны считываться из постоянного хранилища, что, как правило, является самым большим узким местом в вычислениях. Как правило, быстрее читать меньше байтов и кодировать их на лету. Только если ваша система привязана к процессору вместо привязки IO, и вы регулярно выводите изображение в base64, тогда рассмотрите сохранение в base64.

Встроенные изображения (кодированные в формате base64 изображения, встроенные в HTML) являются узким местом - вы отправляете на 33% больше данных по проводу и делаете это последовательно (веб-браузер должен ждать встроенных изображений, прежде чем он сможет завершите загрузку страницы HTML).

Если вы все еще хотите сохранить изображения base64 в кодировке, пожалуйста, что бы вы ни делали, убедитесь, что вы не храните данные в кодировке base64 в столбце UTF8, а затем индексируете его.

+2

хорошее разъяснение; но если вы будете искать, вы найдете много учебников для хранения в качестве base64 и нескольких для двоичного хранения. – Googlebot

+1

Base64 не содержит контрольной суммы или чего-либо, что бы ни стоило хранить. Если вы предоставите ссылку с аргументом для ее использования в качестве хранилища, я развенчу ее для вас. :) –

+2

@MarcusAdams Как насчет сохранения изображений аватара пользователя с помощью base64? Зачем мне переводить назад и вперед через base64/raw, когда я могу просто закодировать один раз и забыть об этом? –

0

Я рекомендую посмотреть современные базы данных, такие как NoSQL, а также я согласен с user1252434. Например, я храню несколько < 500kb PNG в качестве base64 на моем монго-db с двоичным значением, установленным в true, без какого-либо повышения производительности. Mongo можно использовать для хранения больших файлов, таких как видео 10MB, и которые могут предложить огромные преимущества экономии времени в поиске метаданных для этих видео, см. storing large objects and files in mongodb.

+0

Из того, что я использую в спецификации bson, MongoDb затем хранит байт-массивы, а не base64-кодированные, но как необработанные байты с префиксом их длины. – Volker

Смежные вопросы