web-dev-qa-db-fra.com

Puis-je stocker des images dans MySQL

Doublons possibles:
Images en MySQL
Stocker des images dans MySQL

J'essaie de développer un site Web sur lequel les utilisateurs téléchargent leurs images dans le cadre de l'enregistrement. Je le veux que pour chaque image, il devrait y avoir un pouce créé avec PHP (ce qui n'est pas si difficile). Je veux enregistrer les pouces (car ils sont très petits) dans la base de données et j'utilise MySQL. (Je ne veux pas enregistrer les vignettes en tant que fichiers physiques sur le lecteur.)
Est-ce que MySQL permet de sauvegarder et de récupérer des données d’image et comment y aller? S'il ne prend pas en charge les données d'image, existe-t-il une base de données gratuite qui le fait? Je serai heureux si un lien peut être fourni.
Merci.

115
afaolek

Oui, vous pouvez stocker des images dans la base de données, mais ce n'est pas conseillé, à mon avis, et ce n'est pas pratique courante.

Une pratique courante consiste à stocker des images dans des répertoires du système de fichiers et à stocker des références aux images de la base de données. par exemple. chemin de l’image, nom de l’image, etc. Vous pouvez également stocker des images sur un réseau de diffusion de contenu (CDN) ou de nombreux hôtes sur un vaste territoire, et stocker des références pour accéder à ces ressources dans la base de données.

Les images peuvent devenir très grandes, supérieures à 1 Mo. Ainsi, stocker des images dans une base de données peut potentiellement mettre une charge inutile sur votre base de données et le réseau entre votre base de données et votre serveur Web si elles se trouvent sur des hôtes différents.

J'ai travaillé dans des startups, des entreprises de taille moyenne et de grandes entreprises technologiques comptant plus de 400 000 employés. Au cours de mes 13 années d'expérience professionnelle, je n'ai jamais vu personne stocker des images dans une base de données. Je dis cela pour appuyer l'affirmation selon laquelle il s'agit d'une pratique peu commune.

230
FinalForm

Vous aurez besoin de sauvegarder en tant que blob, le type de données LONGBLOB dans mysql fonctionnera.

Ex:

CREATE TABLE 'test'.'pic' (
    'idpic' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
    'caption' VARCHAR(45) NOT NULL,
    'img' LONGBLOB NOT NULL,
  PRIMARY KEY ('idpic')
)

Comme d'autres l'ont dit, c'est une mauvaise pratique, mais cela peut être fait. Je ne sais pas si ce code évoluera bien, cependant.

37
developerdoug

Vous pouvez stocker des images dans MySQL sous forme de blobs. Cependant, cela pose problème pour plusieurs raisons:

  • Les images peuvent être plus difficiles à manipuler: vous devez d'abord les récupérer à partir de la base de données avant de pouvoir effectuer des opérations en bloc.
  • Sauf dans de très rares cas où toute la base de données est stockée dans la RAM, les bases de données MySQL sont finalement stockées sur disque. Cela signifie que vos images de base de données sont converties en blobs, insérées dans une base de données, puis stockées sur disque. vous pouvez économiser beaucoup de temps en les stockant simplement sur un disque.

Au lieu de cela, envisagez de mettre à jour votre table pour ajouter un champ image_path. Par exemple:

ALTER TABLE `your_table`
ADD COLUMN `image_path` varchar(1024)

Puis stockez vos images sur le disque et mettez à jour la table avec le chemin de l'image. Lorsque vous devez utiliser les images, récupérez-les à partir du disque en utilisant le chemin spécifié.

Un effet secondaire avantageux de cette approche est que les images ne sont pas nécessairement stockées sur disque; vous pouvez tout aussi facilement stocker une URL au lieu d'un chemin d'image et récupérer des images à partir de n'importe quel emplacement connecté à Internet.

14
George Cummins

Vous devrez stocker l'image dans la base de données en tant que BLOB.

vous voudrez créer une colonne appelée PHOTO dans votre table et la définir comme un mediumblob.

Ensuite, vous voudrez l'obtenir à partir du formulaire comme suit:

    $data = file_get_contents($_FILES['photo']['tmp_name']);

puis définissez la colonne à la valeur dans $ data.

Bien sûr, c'est une mauvaise pratique et vous voudrez probablement stocker le fichier sur le système avec un nom qui correspond au compte de l'utilisateur.

5
bsimic