PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : Général » Stocker/lire du binaire par requete sql » 30/03/2010 23:26:31

gleu a écrit :

Pour stocker dans un champ text, il faut respecter l'encodage indiquée au niveau de la base. Donc stocker des données binaires dans un champ text ne fonctionnera pas si la donnée binaire ne correspond pas à un code accepté par l'encodage.

Autrement dit, utiliser un bytea permet de stocker des octets comme 0x00. Pour stocker ces informations, il faut réaliser un « échappement » des données. C'est le pilote qui fournit ça. Par exemple, en PHP, il faut utiliser la fonction pg_escape_bytea. Sur d'autres langages, elle aura un autre nom.

Ok. Merci beaucoup pour ces explications précises... Je vais me mettre en quête de la solution en Delphi. Merci aussi pour votre promptitude.

#2 Re : Général » Stocker/lire du binaire par requete sql » 30/03/2010 21:54:34

gleu a écrit :

Autrement dit, il est bien plus simple que l'applicatif lise lui-même le fichier binaire, stocke tout ça dans une variable et renvoie le tout dans une requête du type :

INSERT INTO la_table (la_colonne_bytea) VALUES ('les données binaires');

Entièrement d'accord : on en revient à ma question initiale , quelle syntaxe sql pour ce type d'insert ? ce que vous mettez dans 'les données binaires' doit correspondre à quoi : une simple chaine de caractères correspondant au fichier ? on aurait donc un truc du style :

INSERT INTO la_table (la_colonne_bytea) VALUES ('zs&é<"@drflc;p)9'), 'zs&é<"@drflc;p)9' étant la représentation caracteres du fichier, tout simplement ? Dans ce cas là, quel intérêt de stocker dans un champ de type bytea, et pas un champ de type text ? Optimisation de l'espace ?

merci

#3 Re : Général » Stocker/lire du binaire par requete sql » 30/03/2010 17:36:00

gleu a écrit :

La lecture du fichier peut se faire via une requête SQL mais cela sous-entend que le fichier est lisible par l'utilisateur postgres et donc qu'il se trouve sur le serveur PostgreSQL.

Merci de votre réponse très rapide, mais pourriez vous être plus explicite ?
A la lecture de ce post (http://forums.postgresql.fr/viewtopic.php?id=146), il semble que cela ne soit pas possible d'écrire ce type de donnée via un insert pur : Vous confirmez qu'il n'existe aucune fonction spécifique ?

#4 Général » Stocker/lire du binaire par requete sql » 30/03/2010 17:25:38

troycanneda
Réponses : 8

Bonjour,

Je souhaite stocker des petits fichiers (fichier image, fichier texte) dans ma base.
J'envisage d'utiliser un champ de type bytea, puisque mes fichiers sont relativement petits (<300ko).
Par contre, je n'arrive pas à trouver une solution/fonction pour écrire/lire directement ce type de données en sql.
A savoir, je voudrais insérer ce type de données directement via un insert...l'idéal serait d'avoir une fonction qui chargerait directement à partir d'un chemin : ex -> insert into matable values (file_to_area("c:\monfichier.txt"))

idem en lecture pour recuperer le flux binaire.

J'espère m'être fait comprendre ;-)

Je travaille en delphi avec les composants d'accès Bdd Zeos Access : j'ai une solution de repli par une solution basée sur le edit/post (voir ci-dessous), mais je préfèrerait une solution full sql

[
    if Dataset.State <> dsEdit then
      Dataset.Edit;

    BlobStream := Dataset.CreateBlobStream(
      Dataset.FieldByName(edtBlobColumn.Text), bmWrite);
    try
      FileStream := TFileStream.Create(dlgOpenFile.FileName, fmOpenRead);
      try
        BlobStream.CopyFrom(FileStream, FileStream.Size);
      finally
        FileStream.Free;
      end;
    finally
      BlobStream.Free;
    end;

    Dataset.Post;
]

A vous lire
D'avance merci.

Pied de page des forums

Propulsé par FluxBB