web-dev-qa-db-fra.com

Comment insérer des fichiers BLOB et CLOB dans MySQL?

Je souhaite stocker des images et des fichiers .docx/.doc, .pptx/.ppt, .pdf à l'aide de l'interface de mon logiciel. Je ne comprends pas comment implémenter cela et comment insérer les fichiers BLOB et CLOB dans la table. Veuillez aider.

J'utilise Kubuntu 11.04, MySQL5, Qt 4.7.3.

21
user1411472

Deux façons:

1 - Utilisez une fonction LOAD_FILE -

INSERT INTO table1 VALUES(1, LOAD_FILE('data.png'));

2 - Insérez le fichier sous forme de chaîne hexadécimale, par ex. -

INSERT INTO table1 VALUES 
  (1, x'89504E470D0A1A0A0000000D494844520000001000000010080200000090916836000000017352474200AECE1CE90000000467414D410000B18F0BFC6105000000097048597300000EC300000EC301C76FA8640000001E49444154384F6350DAE843126220493550F1A80662426C349406472801006AC91F1040F796BD0000000049454E44AE426082');
28
Devart
INSERT INTO MY_TABLE(id, blob_col) VALUES(1, LOAD_FILE('/full/path/to/file/myfile.png')

LOAD_FILE est associé à de nombreuses conditions. De la documentation MySQL :

LOAD_FILE (nom_fichier)

Lit le fichier et renvoie le contenu du fichier sous forme de chaîne. Pour utiliser cette fonction, le fichier doit se trouver sur l'hôte du serveur, vous devez spécifier le nom de chemin complet du fichier et vous devez disposer du privilège FILE. Le fichier doit être lisible par tous et sa taille inférieure aux octets max_allowed_packet. Si la variable système secure_file_priv est définie sur un nom de répertoire non vide, le fichier à charger doit se trouver dans ce répertoire.

Si le fichier n'existe pas ou ne peut pas être lu car l'une des conditions précédentes n'est pas remplie, la fonction renvoie NULL.

Il existe également des bogues avec LOAD_FILE sous Linux. Voir http://bugs.mysql.com/bug.php?id=384 pour le bogue, et MySQL LOAD_FILE retournant NULL pour des solutions de contournement. Sur Ubuntu 12.04, MySQL 5.5.32, cela fonctionne pour moi:

  1. Copier le fichier dans/tmp
  2. Changer de propriétaire en utilisateur mysql chown mysql:mysql /tmp/yourfile
  3. Connectez-vous à mysql en tant qu'utilisateur root mysql pour être sûr d'avoir le privilège FILE
  4. Exécutez votre instruction d'insertion
11
lreeder

Ou vous pouvez simplement utiliser MySQL Workbench, sélectionner les lignes, les dernières lignes, insérer une ligne sans le blob, puis faire un clic droit et sélectionner "Charger la valeur à partir du fichier".

5
Rodd Johnson
INSERT INTO table1 VALUES(1, LOAD_FILE(data.png));

ne fonctionnera pas mais

INSERT INTO table1 VALUES(1, LOAD_FILE('data.png'));

devrait (en supposant que data.png existe dans le répertoire local)

1
Chris Hobbs

pour les personnes qui obtiennent une erreur "L'image" de la colonne ne peut pas être nulle "lors de l'enregistrement de l'objet blob via la requête: -

Ouvrez votre client de ligne de commande MySql et connectez-vous avec l'utilisateur root et tapez

mysql> SHOW VARIABLES LIKE "secure_file_priv";

cela vous montrera le chemin sécurisé utilisé par MySql pour accéder aux fichiers. quelque chose comme

+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+

vous pouvez soit coller des fichiers dans ce dossier, soit changer la valeur de la variable "secure_file_priv" en "chaîne vide" afin qu'il puisse lire le fichier de n'importe où.

0
Ravi.Dudi