Étant donné que la surcharge pour n'importe quelle ligne dans PostgreSQL est de 23 octets (HeapTupleHeaderData), si vous vous souciez vraiment des petites quantités d'espace, vous avez probablement choisi la mauvaise façon de stocker vos données.
Quoi qu'il en soit, étant donné que tous les types les plus compliqués ont leur propre surcharge (bytea ajoute quatre octets de surcharge par exemple, les chaînes de bits 5 à 8), la seule façon d'accomplir ce que vous recherchez est d'utiliser un bigint (8 octets), décaler numériquement chaque valeur et associer le résultat par un OU. Vous pouvez le faire en utilisant les opérations sur les chaînes de bits pour rendre le code plus facile - calculez en tant que chaîne de bits, puis convertissez-le en bigint avant de le stocker - ou multipliez/ajoutez simplement manuellement si vous voulez que la vitesse soit meilleure. Par exemple, voici comment stocker deux octets ensemble dans une structure à deux octets, puis les récupérer :
int2 = 256 * byte1 + byte2
byte1 = int2 / 256
byte2 = int2 % 256
Vous pouvez étendre la même idée en stockant 7 d'entre eux de cette façon. La surcharge de récupération sera toujours terrible, mais vous aurez en fait économisé de l'espace dans le processus. Mais pas vraiment par rapport à l'en-tête de ligne.