2011-02-03 3 views
1

J'utilise la fonction struct.pack de Python pour empaqueter différents types de données dans un champ entier commun de 32 bits dans PostgreSQL. L'inconvénient est que je ne peux pas fonctionner avec ces valeurs dans la base de données, je dois effectuer un struct.unpack en Python sur les données pour savoir ce qu'il représente.Comment décompresser un entier dans un float dans PostgreSQL?

Si j'emballe un flottant de 32 bits dans ce champ, est-il possible de faire en sorte que PostgreSQL fasse la conversion pour moi?

J'ai essayé, mais cela n'a pas fonctionné:

select cast(cast(value as bit(32)) as float4) ... 

Il chassera avec succès l'entier de bits (32), mais il ne sera pas le convertissez à nouveau à un flotteur.

Répondre

1

La solution la plus simple, et je suis sûr que vous avez considéré et abandonné, est de stocker des valeurs à virgule flottante de 32 bits dans une colonne définie pour utiliser un type de données à virgule flottante de 32 bits. CAST() ne fonctionnera pas pour vous, car a) CAST() ne sait rien sur les structures C, endian-ness, ou octets de remplissage, et b) vous ne pouvez pas convertir un type de données binaire en un type de données en virgule flottante. (Vous pouvez cependant convertir un type de données bit en nombre entier.)

4

Une réponse que vous ne cherchez probablement pas: ne faites pas cela.

Ceci est une violation de l'essentiel: une valeur dans une base de données doit être atomique, non divisible en d'autres valeurs. Toutes les opérations de la base de données (ai-je mentionné tous) sont réglées pour gérer des valeurs individuelles. Vous «combattez le cadre» ici.

Même si vous pouvez le retirer, ce sera un frein sur les performances. De plus, la base de données n'est pas à signaler, ce n'est pas seulement que vous avez ce problème maintenant, chaque tentative de lire ces données pour une raison quelconque se heurtera à ce problème. Eh bien, je ne veux pas me lancer dans une diatribe, déclara nuf.

Questions connexes