Stocker l'image dans la base de données directement ou sous forme de données base64?

La méthode commune pour stocker des images dans une base de données est de convertir l'image base64 données avant de stocker les données. Ce processus augmentera la taille de 33%. Il est également possible de stocker directement l'image comme un BLOB; par exemple:

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

puis afficher l'image avec

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

avec cette dernière méthode, nous économisons 1/3 d'espace de stockage. Pourquoi est-il plus courant de stocker des images comme base64 dans MySQL les bases de données?

mise à jour: il y a de nombreux débats sur les avantages et les inconvénients de stocker des images dans des bases de données, et la plupart des gens pensent que ce n'est pas une approche pratique. Quoi qu'il en soit, je suppose que nous stockons l'image dans la base de données, et discuter de la meilleure méthode pour le faire.

39
demandé sur PdC 2012-03-15 19:10:36

3 réponses

  • Pro base64: la représentation codée que vous manipulez est une chaîne assez sûre. Il ne contient ni barres de contrôle ni guillemets. Ce dernier point aide contre les tentatives D'injection SQL. Je ne m'attendrais pas à ce qu'il y ait un problème pour juste ajouter la valeur à une chaîne de requête SQL "codée à la main".

  • Pro BLOB: le logiciel de gestionnaire de base de données sait à quel type de données il doit s'attendre. Il peut optimiser pour cela. Si vous voulez stocker base64 dans un champ de texte il pourrait essayer de construire un indice ou une autre structure de données pour elle, qui serait vraiment agréable et utile pour les "vraies" données de texte, mais inutile et une perte de temps et d'espace pour les données d'image. Et c'est la plus petite, comme en nombre d'octets, la représentation.

44
répondu user1252434 2018-08-16 10:17:02

je soutiens que les images (fichiers) ne sont généralement pas stockées dans une base de données encodée base64. Au lieu de cela, ils sont stockés dans leur forme binaire brute dans une colonne (ou un fichier) binaire (blob).

la Base64 n'est utilisée que comme mécanisme de transport, et non pour le stockage. Par exemple, vous pouvez intégrer une image encodée base64 dans un document XML ou un message électronique.

Base64 est également diffuser sympathique. Vous pouvez encoder et de décoder à la volée (sans connaître la taille totale de la données.)

Tout en base64 est très bien pour le transport, ne pas stocker vos images encodées en base64.

Base64 ne fournit aucun checksum ou n'importe quoi de n'importe quelle valeur pour le stockage.

encodage Base64 augmente le besoin de stockage de 33% par rapport à un format binaire brut. Il augmente également la quantité de données qui doivent être lues à partir du stockage persistant, qui est encore généralement le plus gros goulot d'étranglement dans l'informatique. Il est généralement plus rapide de lire moins d'octets et de les encoder à la volée. Seulement si votre système est relié par CPU au lieu de IO, et que vous produisez régulièrement l'image dans base64, alors envisagez de la stocker dans base64.

inline images (base64 encoded images embedded in HTML) sont un goulot d'étranglement eux-mêmes--vous envoyez 33% plus de données sur le fil, et le faire en série (le navigateur Web doit attendre sur les images en ligne avant de pouvoir terminer le téléchargement de la page HTML).

Si vous souhaitez stocker des images en base64, veuillez, quoi que vous fassiez, assurez-vous de ne pas stocker des données codées base64 dans une colonne UTF8 puis de les indexer.

44
répondu Marcus Adams 2017-04-13 13:36:27

je recommande à la recherche dans les bases de données NoSQL comme et aussi je suis d'accord avec user1252434'courrier. Par exemple, je stocke quelques PNG < 500kb comme base64 sur Mongo db avec un ensemble binaire à true sans aucun succès de performance. Mongo peut être utilisé pour stocker de gros fichiers comme des vidéos de 10 Mo et cela peut offrir d'énormes avantages en termes de gain de temps dans les recherches de métadonnées pour ces vidéos, voir stocker de gros objets et des fichiers en mongodb.

0
répondu msmfsd 2016-07-25 22:14:18