J'ai une base de données dans laquelle l'une des tables stocke un blob ( bytea
) de toutes sortes de données génériques collectées à partir d'un autre système. Les bytea
peut contenir n'importe quoi. Pour savoir comment interpréter les données, le tableau comporte également un champ de format. J'ai écrit une application Java pour lire le bytea
de la base de données en tant que byte[]
et je peux ensuite facilement le convertir en double[]
o int[]
ou tout autre format indiqué dans le champ de format en utilisant ByteBuffer
et les différents points de vue ( DoubleBuffer
, IntBuffer
etc.)
Je me trouve maintenant dans une situation où je dois manipuler les données dans la base de données elle-même au sein d'une fonction de déclenchement afin de maintenir l'intégrité avec une autre table. Je peux trouver des conversions pour à peu près tous les types de données imaginables, mais je ne trouve rien pour passer de bytea
(ou même bit
) à double precision
et retour. A bytea
peut être décomposée, convertie en bits, puis convertie en un int
o bigint
mais pas un double precision
. Par exemple, x'deadbeefdeadbeef'::bit(64)::bigint
sera converti en -2401053088876216593
sans problème, mais x'deadbeefdeadbeef'::bit(64)::double precision
échoue avec "ERROR : cannot cast type bit to double precision" au lieu de donner la réponse IEEE 754 de -1.1885959257070704E148
.
J'ai trouvé cette réponse https://stackoverflow.com/a/11661849/5274457 qui met en œuvre la norme IEEE pour convertir les bits en doubles, mais n'y a-t-il pas une fonction de conversion de base dans PostgreSQL pour le faire ? De plus, j'ai besoin de revenir en arrière en partant de double precision
a bytea
lorsque j'ai fini de manipuler les données et que je dois mettre à jour les tables, ce que cette réponse ne permet pas de faire.
Des idées ?