it-swarm.com.ru

Хранить изображение в базе данных напрямую или как данные base64?

Распространенный метод хранения изображений в базе данных - преобразование изображения в данные 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?

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

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

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

53
user1252434

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

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

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

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

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

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

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

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

50
Marcus Adams

Я рекомендую взглянуть на современные базы данных, такие как NoSQL, а также согласен с постом user1252434. Например, я храню несколько PNG <500 КБ как base64 на моем Mongo db с бинарным значением true без потери производительности вообще. Mongo может использоваться для хранения больших файлов, таких как видео размером 10 МБ, и это может предложить огромные преимущества в экономии времени при поиске метаданных по этим видео, см. хранение больших объектов и файлов в mongodb

0
msmfsd