Vous n'êtes pas identifié(e).
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
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 )
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
Merci de ton aide,
On a donc corrigé le problème en modifiant le fichier postgresql.conf :
bytea-output='escape'
Hors ligne
Yep, mauvais coup. Je viens de le traduire. Rien à re-générer la doc
Guillaume.
Hors ligne
quand j'insere bytea_output = 'escape' dans postgresql.conf , le serveur 8.4 refuse de redemarrer...
Hors ligne
C'est normal, il s'agit d'un paramètre apparut en 9.0. Vous devez donc le supprimer de votre fichier de configuration.
Julien.
https://rjuju.github.io/
Hors ligne
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
Avez-vous mis "bytea_output" ou "bytea-output" ? Car seul le premier est correct.
Julien.
https://rjuju.github.io/
Hors ligne