Vous n'êtes pas identifié(e).
Pages : 1
Bonjour à tous,
je prépare la conversion d'une base Visual Foxpro vers Postgre. Dans pratiquement toutes mes tables, j'ai un champ 'bits' de type integer dans lequel je peux traiter facilement chaque bit individuellement (VFP à toutes les fonctions pour celà). Ce champ contient donc, fonctionnellement, 32 bits; chacun ayant sa propre signification.
Comme je voudrai pouvoir aussi accéder aux tables transférées sous Postgre en PL/pgSQL je cherche le meilleur type de données correspondant à ces 32 bits sous Postgre.
L'ideal serait INTEGER (cela simplifierait mes vues distantes sous VFP) mais a-t-on les fonctions pouvant sélectionner ou mettre à jour un bit dans un INTEGER (est-ce que les fonctions get_bit et set_bit fonctionneraient avec un INTEGER ?)
Sinon, je n'ai pas bien compris la différence entre les chaines de bits et le type bytea ...
Bonne fin de week-end à tous
Jean à Grenoble
Hors ligne
On peut facilement s'en sortir avec integer ou bit, vu qu'on a des opérateurs de cast...
Par exemple:
=> select (12::bit(32) & 27::bit(32))::integer;
int4
------
8
(1 row)
Integer sera plus compact (ça n'est pas un type de taille variable, donc on ne perd pas de place sur l'entête).
Par contre, c'est probablement pas très très conforme à la première forme normale (atomicité des attributs), même si c'est difficile de l'affirmer sans le schéma...
Marc.
Hors ligne
Vous pouvez utiliser vos propres fonctions si ça vous simplifie le portage.
Avec la convention de numérotation des bits de 0 à 31 en partant de la droite:
CREATE FUNCTION set_bit(valeur int4, numbit int4) RETURNS int4
AS ' SELECT valeur | (1 << numbit)'
LANGUAGE SQL IMMUTABLE;
CREATE FUNCTION get_bit(valeur int4, numbit int4) RETURNS int4
AS ' SELECT ((valeur & (1 << numbit))>>numbit)&1'
LANGUAGE SQL IMMUTABLE;
Attention au fait que les entiers sont signés avec PostgreSQL via le bit 31.
Concernant les différences entre bytea et bit(n)/varbit(n), le premier n'est pas spécialement fait pour gérer des champs de bits alors que les deux autres oui. Il y a plein de fonctions et opérateurs qui prendront du bytea et pas du bit/varbit et inversement.
Les valeurs bit(n) sont représentées pour les entrées/sorties en séries de 0 et 1 alors que les bytea sont en octets, avec d'ailleurs plusieurs formes possibles.
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Bonsoir,
j'ai mis un peu de temps à revenir à Postgre ! Merci pour votre réponse qui m'ouvre plein d'horizons. Je suis juste un peu inquiet sur le temps de réponse (j'ai énormément de calculs binaires) mais pour l'instant cela me convient ..
Merci encore
Jean à Grenoble
Hors ligne
Pages : 1