Хранить изображение в базе данных напрямую или как данные base64? - PullRequest
50 голосов
/ 15 марта 2012

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

$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 дискового пространства.Почему чаще хранить изображения как base64 в базах данных MySQL?

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

Ответы [ 3 ]

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

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

57 голосов
/ 15 марта 2012

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

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

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

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

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

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

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

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

0 голосов
/ 26 июля 2016

Я рекомендую взглянуть на современные базы данных, такие как NoSQL, а также согласен с постом user1252434 .Например, я храню несколько PNG <500 КБ как base64 на моей базе данных Mongo с бинарным значением true без потери производительности вообще.Mongo может использоваться для хранения больших файлов, таких как видео размером 10 МБ, и это может дать огромные преимущества при поиске метаданных для этих видео, см. <a href="http://blog.mongodb.org/post/183689081/storing-large-objects-and-files-in-mongodb" rel="nofollow"> хранение больших объектов и файлов в mongodb .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...