I am working with a table in a PostgreSQL database that has several boolean columns that determine some state (e.g. published
, visible
, etc.). I want to make a single status column that will store all these values as well as possible new ones in a form of a bitmask. Is there any difference between integer
and bit(n)
in this case?
This is going to be a rather big table, because it stores objects that users create via a web-interface. So I think I will have to use (partial) indexes for this column.
If you only have a few variables I would consider keeping separate
boolean
columns.boolean
columns allowNULL
values for individual bits if you should need that. You can always define columnsNOT NULL
if you don't.If you have more than a hand full variables but no more than 32, an
integer
column may serve best. (Or abigint
for up to 64 variables.)=
operator).varbit
orboolean
.With even more variables, or if you want to manipulate the values a lot, or if you don't have huge tables or disk space / RAM is not an issue, or if you are not sure what to pick, I would consider
bit(n)
orbit varying(n)
(short:varbit(n)
.For just 3 bits of information, individual
boolean
columns get by with 3 bytes, aninteger
needs 4 bytes (maybe additional alignment padding) and abit string
6 bytes (5 + 1).For 32 bits of information, an
integer
still needs 4 bytes (+ padding), abit string
occupies 9 bytes for the same (5 + 4) andboolean
columns occupy 32 bytes.To optimize disk space further you need to understand the storage mechanisms of PostgreSQL, especially data alignment. More in this related answer.
This answer on how to transform the types boolean, bit(n) and integer may be of help, too.
You can apply the bit string functions directly to a bit string without the need to cast from an integer.