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

#1 13/10/2010 18:22:21

Gold.Strike
Membre

Problème avec la sauvegarde d'une données de type bytea avec Postgre 9

Bonjour,

Je développe un projet en C# (Framework .Net 4), avec une base de données PostgreSQL.
Je suis confronté à un problème concernant la sauvegarde et la récupération de données d'une colonne de type bytea, suite au passage de la version Postgre SQL 8.4 à la version 9.

Lorsque je récupère dans mon code la donnée de type byte[] stockée dans ma base de données, celle ci est différente et est deux fois plus grande que celle qui a été sauvegardée avec une la version base de Postgr 9, alors que les données sont bien identiques avec la version 8.4.

Explications :

J'ai un tableau de byte de taille 100, je le sauvegarde dans la base de donnée à l'aide d'une requête classique :

command.CommandText = "INSERT INTO table(donnees) VALUES(:donnees)";
command.Parameters.Add(new NpgsqlParameter("donnees", DbType.Binary)).Value = monByteA;

Je récupère ensuite cette donnée à l'aide d'une requête du type :

command.CommandText = "SELECT donnees FROM table WHERE id = 308";

J'obtiens bien un byte[] mais celui-ci pèse 201 (100*2+1).

Quelque soit la valeur de mon byte[] sauvegardé, la valeur récupérée est celle d'origine*2+1.
Il n'y pas donc pas moyen d'exploiter les données récupérées...

Je n'ai pas ce soucis avec la version de Postgre 8.4, mais le problème apparait sur une base sauvegardée depuis la version 8.4 et qui a été restaurée sur une version 9...

- Auriez vous une idée d'où ce problème peut venir?
- Je n'ai pas vu de références particulières aux données de type 'bytea' dans le changelog de Postgre 9, y a t'il une gestion différente?
- Dans le pire des cas, la donnée traitée peut être stockée au format XML, mais cela engendrerait des pertes de performances.

Hors ligne

#2 13/10/2010 19:19:01

Marc Cousin
Membre

Re : Problème avec la sauvegarde d'une données de type bytea avec Postgre 9

Bonjour, la raison est la suivante :

http://docs.postgresqlfr.org/9.0/runtim … tea-output
(au passage, guillaume, on dirait que le paragraphe est passé à la trappe, côté traduction smile )

Lisez aussi cela:
http://docs.postgresqlfr.org/9.0/datatype-binary.html

En clair, le format 'par défaut, d'export en format texte des bytea a changé, d'où votre problème. Le nouveau format est plus performant et plus simple à analyser.

Si vous voulez tout de même garder l'ancien comportement, vous avez deux possibilités:
- Modifier bytea_output
- utiliser la fonction 'encode' explicitement (http://docs.postgresqlfr.org/9.0/functi … tring.html).

Dans les deux cas, le format qui vous intéresse est 'escape'.


Marc.

Hors ligne

#3 14/10/2010 11:00:45

Gold.Strike
Membre

Re : Problème avec la sauvegarde d'une données de type bytea avec Postgre 9

Merci de ton aide,

On a donc corrigé le problème en modifiant le fichier postgresql.conf :

bytea-output='escape'

Hors ligne

#4 14/10/2010 11:09:30

gleu
Administrateur

Re : Problème avec la sauvegarde d'une données de type bytea avec Postgre 9

Yep, mauvais coup. Je viens de le traduire. Rien à re-générer la doc smile


Guillaume.

Hors ligne

#5 04/08/2013 17:33:00

icadedt
Membre

Re : Problème avec la sauvegarde d'une données de type bytea avec Postgre 9

quand j'insere bytea_output = 'escape' dans postgresql.conf , le serveur 8.4 refuse de redemarrer...

Hors ligne

#6 04/08/2013 18:46:46

rjuju
Administrateur

Re : Problème avec la sauvegarde d'une données de type bytea avec Postgre 9

C'est normal, il s'agit d'un paramètre apparut en 9.0. Vous devez donc le supprimer de votre fichier de configuration.

Hors ligne

#7 04/08/2013 22:05:08

icadedt
Membre

Re : Problème avec la sauvegarde d'une données de type bytea avec Postgre 9

j'ai essayé sur postgresql 9.2 , je n'arrive pas non plus à redemarrer le serveur 9.2 en mettant bytea-output='escape'

Hors ligne

#8 05/08/2013 08:04:40

rjuju
Administrateur

Re : Problème avec la sauvegarde d'une données de type bytea avec Postgre 9

Avez-vous mis "bytea_output" ou "bytea-output" ? Car seul le premier est correct.

Hors ligne

Pied de page des forums