PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 05/08/2018 17:05:11

trainvapeur
Membre

integer, bit ou bytea ?

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

#2 05/08/2018 19:41:44

Marc Cousin
Membre

Re : integer, bit ou bytea ?

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

#3 06/08/2018 16:12:23

dverite
Membre

Re : integer, bit ou bytea ?

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.

Hors ligne

#4 20/08/2018 18:34:43

trainvapeur
Membre

Re : integer, bit ou bytea ?

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

Pied de page des forums