IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Firebird Discussion :

Contenu d'un BLOB illisible


Sujet :

Firebird

  1. #1
    Membre habitué Avatar de LaNat
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 164
    Points
    164
    Par défaut Contenu d'un BLOB illisible
    Bonjour,

    J'ai une table dans ma base qui contient un champ de type BLOB, et je dois exporter ces données vers une base gérée par SQL Server. Ce champ ne contient que du texte, d'où l'inutilité du BLOB je pense.

    J'ai plusieurs questions :

    - J'ai regardé les types de données dans SQL Server, il n'y a pas BLOB, mais comme mes données sont du texte, je peux peut être mettre ce champ en varchar(255) ou y a-t-il un type plus approprié pour des lignes de texte?

    - Lorsque je fais un select sur la colonne du BLOB, rien ne s'affiche, je n'arrive pas à récupérer les données texte contenues dans le BLOB. Comment je pourrais m'y prendre?

    Merci d'avance!

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Il y a un equivallent du BLOB sous sql serveur mais probablement à la sauce microsoft...

    Visiblement vous ne savez pas ce qu'est un blob sinon vous ne diriez pas qu'il suffit de créer un varchar(255) pour le remplacer

    Un blob peux contenir n'importe quel données (binaire(images, son, etc), ou texte). Il n'est pas limité en taille (en théorie car en pratique il y a une limite je crois que 4Go)).


    Donc votre BLOB est peut etre de type texte mais si c'est un blob qui a été utilisé c'est que probablement les textes contenu dépassent (ou sont suceptibles de dépasser) la limite de taille d'un varchar (qui est de 32Ko).

    Pour les extraires et les réinjecter vous ne pourrez pas le faire avec un simple SELECT / INSERT.
    Il vous faudra utiliser obligatoirement des composants ou l'API qui sait gérer les BLOB afin de les extraires et les réinsjecter dans sqlServer.

    Si vous ne souhaitez pas faire un programme d'extraction sachez qu'ibexpert peux extraire les BLOB (il suffit de cocher dans les options Extract BLOB sous l'option format DATE que vous n'aviez pas vu la dernière fois.)
    Les BLOBs sont extraits dans un fichier (concaténés tous dans le même fichier) et dans le script d'extraction pour chaque insert vous avez l'adresse en hexa de la position de début et de fin (en octets) dans ce fichier du blob correspondant à l'enregistrement.

  3. #3
    Membre habitué Avatar de LaNat
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 164
    Points
    164
    Par défaut
    Visiblement vous ne savez pas ce qu'est un blob sinon vous ne diriez pas qu'il suffit de créer un varchar(255) pour le remplacer

    Un blob peux contenir n'importe quel données (binaire(images, son, etc), ou texte). Il n'est pas limité en taille (en théorie car en pratique il y a une limite je crois que 4Go)).

    Donc votre BLOB est peut etre de type texte mais si c'est un blob qui a été utilisé c'est que probablement les textes contenu dépassent (ou sont suceptibles de dépasser) la limite de taille d'un varchar (qui est de 32Ko).
    Oui je suis d'accord mais les données existantes et celles à venir servent à renseigner la nature d'un événement de l'entreprise (par exemple : "a appelé car son logiciel a planté en pleine sauvegarde, je lui ai donc dis de faire ci, ça, ça", "penser à acheter l'apéro pour le pot de départ de Truc Muche"....), je ne pense donc pas avoir besoin d'un espace de 4Go pour stocker ce genre d'infos?!

    Si vous ne souhaitez pas faire un programme d'extraction sachez qu'ibexpert peux extraire les BLOB (il suffit de cocher dans les options Extract BLOB sous l'option format DATE que vous n'aviez pas vu la dernière fois.)
    aaaaaaahhhhhhhhhhhh je ne possède pas cette option sur cette version d'IBExpert!! (personnal edition 2004.03.01)

    Sinon merci beaucoup pour toutes ces infos claires et utiles!![/quote]

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Si votre texte n'est pas très important en taille et que c'est acceptable d'avoir une limite. Alors préférez en effet l'utilisation d'un varchar dans votre nouvelle base.

    Reste le problème du transfert.

    Pour vérifier que vous n'avez pas de Blob très gros vous pouvez afficher leur taille en utilisant l'UDF rfunc et la fonction B_Total_Lenght

    Télécharger l'UDF Rfunc : http://rfunc.sourceforge.net/
    copier rfunc.dll sur le serveur firebird dans le répertoire UDF

    Déclarez la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE EXTERNAL FUNCTION B_TOTAL_LENGTH
       BLOB
       RETURNS INTEGER BY VALUE
      ENTRY_POINT 'fn_b_total_length'  MODULE_NAME 'rfunc';
    Puis affichez les tailles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select ID, B_Total_lenght(MonBlob) from MaTable;
    Ou mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ID, b_total_length(MonBlob)
    FROM MaTable
    order by b_total_length(MonBlob) DESC;
    Ainsi vous aurez en premier le BLOB de plus grosse taille, celà vous donnera une indication sur la taille mini de votre varchar de destination.

    Si votre plus gros BLOB ne dépasse pas 16383 octets (limitation de l'exemple qui suit) vous pourrez faire ceci :

    Déclarer la fonction de Rfunc B_LongSubStr :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE EXTERNAL FUNCTION B_LONGSUBSTR
       BLOB, INTEGER, INTEGER
       RETURNS CSTRING(16383) FREE_IT
      ENTRY_POINT 'fn_b_longsubstr'  MODULE_NAME 'rfunc';
    Ensuite il vous suffit de faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ID, MesColonnesSaufLeBlob, b_LongSubStr(MonBlob,0,16383)
    FROM MaTable;
    Et de demander l'export du resultat dans IBExpert (Bouton qui s'affiche après avoir exécuté la requete A droite de valider la transaction et juste a gauche de CountRecord) et n'oubliez pas d'aller dans Options de la fenetre qui s'ouvre pour paramétrer éventuellement le format de la date (si vous avez des colonnes date) et surtout décocher 'Replacer les car. non-imprimable dans les chaines vides' qui est mal traduit... car celà permet de conserver les retours chariots. Sans celà ils seraient remplacés par deux espaces).

  5. #5
    Membre habitué Avatar de LaNat
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 164
    Points
    164
    Par défaut
    Et ben tout ce que je peux dire c'est MERCI BEAUCOUP d'avoir pris le temps de me fournir toutes ces indications, je vais essayer tout ca de suite (enfin apres le casse croute!!) et je vous tiens au courant.

  6. #6
    Membre habitué Avatar de LaNat
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 164
    Points
    164
    Par défaut
    Je n'arrive pas à effectuer le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE EXTERNAL FUNCTION B_TOTAL_LENGTH 
       BLOB 
       RETURNS INTEGER BY VALUE 
      ENTRY_POINT 'fn_b_total_length'  MODULE_NAME 'rfunc';
    pourtant j'ai bien téléchargé rFunc, mis le .dll au bon endroit.

    Voici la réponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    This operation is not defined for system tables.
    unsuccessful metadata update.
    DEFINE FUNCTION failed.
    attempt to store duplicate value (visible to active transactions) in unique index "RDB$INDEX_9".

  7. #7
    Membre habitué Avatar de LaNat
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 164
    Points
    164
    Par défaut
    Non en fait j'ai renommé B_TOTAL_LENGTH en B_TOT_LENGTH et a priori ca fonctionne.

  8. #8
    Membre habitué Avatar de LaNat
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 164
    Points
    164
    Par défaut
    Tout d'abord il ne faut pas oublier de renommer la colonne explicitement car lui la nommera blongsubstr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select idevt, idtypeevt, idint, devt, hevt, lien1, lien2, lien3, datesuivi,
        ack, B_LONGSUBSTR(infos,0,2000) AS infos, auteur, hfevt
    from evenement;
    Puis c'est bizarre, ma plus grosse valeur obtenue est 1194, et même si je met un chiffre énorme comme 50000 dans la parenthèse, j'ai ce message d'erreur quand j'exécute ma requête dans SQL Server :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Serveur : Msg 8152, Niveau 16, État 9, Ligne 1
    Les données chaîne ou binaires seront tronquées.
    L'instruction a été arrêtée.
    Mais là il faut peut être que je change de forum ;-)

  9. #9
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Ou peut etre commencer par nous raconter le debut de l'histoire :

    Ca donne quoi le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ID, b_total_length(MonBlob) 
    FROM MaTable 
    order by b_total_length(MonBlob) DESC;
    ?

  10. #10
    Membre habitué Avatar de LaNat
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 164
    Points
    164
    Par défaut
    Je trouve une taille maximale parmi tous mes blob de 1194.

  11. #11
    Membre habitué Avatar de LaNat
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 164
    Points
    164
    Par défaut
    C'est bon j'ai trouvé ma ridicule erreur : j'avais déclaré mon champ dans sql server comme un varchar(255), trop petit évidemment.
    En tout cas merci beaucoup pour votre aide précieuse!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment lire le contenu d'un BLOB (texte)
    Par Rollois dans le forum SQL
    Réponses: 8
    Dernier message: 27/05/2009, 04h33
  2. Afficher une image contenue dans un Blob
    Par reeda dans le forum Général Java
    Réponses: 4
    Dernier message: 02/02/2009, 15h17
  3. Réponses: 5
    Dernier message: 30/10/2008, 10h06
  4. Réponses: 2
    Dernier message: 21/11/2007, 17h15
  5. [MySQL] afficher une image contenue dans un blob avec d'autres infos
    Par pakkun dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 28/06/2007, 17h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo