Précédent   Forum des professionnels en informatique > Bases de données > Firebird > Débuter
Débuter Forum d'entraide pour débuter avec Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/04/2005, 08h54   #1
Membre habitué
 
Avatar de LaNat
 
Inscription : avril 2005
Messages : 162
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : avril 2005
Messages : 162
Points : 140
Points : 140
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!
LaNat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2005, 09h54   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
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.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2005, 10h49   #3
Membre habitué
 
Avatar de LaNat
 
Inscription : avril 2005
Messages : 162
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : avril 2005
Messages : 162
Points : 140
Points : 140
Citation:
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?!

Citation:
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]
LaNat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2005, 12h01   #4
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
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 :
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 :
SELECT ID, B_Total_lenght(MonBlob) FROM MaTable;
Ou mieux

Code :
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 :
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 :
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).
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2005, 12h09   #5
Membre habitué
 
Avatar de LaNat
 
Inscription : avril 2005
Messages : 162
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : avril 2005
Messages : 162
Points : 140
Points : 140
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.
LaNat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2005, 13h53   #6
Membre habitué
 
Avatar de LaNat
 
Inscription : avril 2005
Messages : 162
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : avril 2005
Messages : 162
Points : 140
Points : 140
Je n'arrive pas à effectuer le script :
Code :
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 :
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".
LaNat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2005, 14h12   #7
Membre habitué
 
Avatar de LaNat
 
Inscription : avril 2005
Messages : 162
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : avril 2005
Messages : 162
Points : 140
Points : 140
Non en fait j'ai renommé B_TOTAL_LENGTH en B_TOT_LENGTH et a priori ca fonctionne.
LaNat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2005, 15h10   #8
Membre habitué
 
Avatar de LaNat
 
Inscription : avril 2005
Messages : 162
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : avril 2005
Messages : 162
Points : 140
Points : 140
Tout d'abord il ne faut pas oublier de renommer la colonne explicitement car lui la nommera blongsubstr :
Code :
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 :
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 ;-)
LaNat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2005, 15h31   #9
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Ou peut etre commencer par nous raconter le debut de l'histoire :

Ca donne quoi le
Code :
1
2
3
SELECT ID, b_total_length(MonBlob) 
FROM MaTable 
ORDER BY b_total_length(MonBlob) DESC;
?
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2005, 15h34   #10
Membre habitué
 
Avatar de LaNat
 
Inscription : avril 2005
Messages : 162
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : avril 2005
Messages : 162
Points : 140
Points : 140
Je trouve une taille maximale parmi tous mes blob de 1194.
LaNat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2005, 08h33   #11
Membre habitué
 
Avatar de LaNat
 
Inscription : avril 2005
Messages : 162
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : avril 2005
Messages : 162
Points : 140
Points : 140
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!!
LaNat est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h59.


 
 
 
 
Partenaires

Hébergement Web