Biorąc pod uwagę, że obciążenie dla dowolnego wiersza w PostgreSQL wynosi 23 bajty (HeapTupleHeaderData), jeśli naprawdę zależy Ci na tak małej ilości miejsca, prawdopodobnie wybrałeś zły sposób przechowywania danych.
Niezależnie od tego, ponieważ wszystkie bardziej skomplikowane typy mają swój własny narzut (bytea dodaje cztery bajty narzutu, na przykład ciągi bitów od 5 do 8), jedynym sposobem na osiągnięcie tego, czego szukasz, jest użycie bigint (8 bajtów), numerycznie przesuwając każdą wartość i łącząc wynik ORAZ. Możesz to zrobić za pomocą operacji na ciągach bitowych aby kod był łatwiejszy — obliczyć jako ciąg bitów, a następnie rzutować na bigint przed zapisaniem — lub po prostu ręcznie pomnóż/dodaj, jeśli chcesz, aby szybkość była lepsza. Na przykład, oto jak zapisać dwa bajty razem w dwubajtowej strukturze, a następnie odzyskać je z powrotem:
int2 = 256 * byte1 + byte2
byte1 = int2 / 256
byte2 = int2 % 256
Możesz rozszerzyć ten sam pomysł na przechowywanie 7 z nich w ten sposób. Koszty pobierania nadal będą straszne, ale w rzeczywistości zaoszczędzisz trochę miejsca w tym procesie. Ale nie za bardzo w stosunku do samego nagłówka wiersza.