What is the right data type to store only -1 0 and 1 in postgres column?
If you want to save space, you can use the "char"
data type. It stores a single byte.
you can cast integer
or text
to "char"
:
SELECT 'u'::"char", 'd'::"char", 'n'::"char";
char | char | char
------+------+------
u | d | n
(1 row)
An enum uses 4 bytes since it is internally stored as a real
.
What you are out to save space, you'll have to take alignment into account. The values are always aligned according to the type alignment. For example, a bigint
always has to start at an address that is divisible by 8.
Now if your table is defined as
CREATE TABLE (
smallflag "char",
largenum bigint
);
there will be 7 padding bytes between the columns, which would render all the space gains from "char"
moot.
So place your table columns carefully.
A bit of a hack, but is you make the column nullable you can still use a bool, with a null value as the third value.
Boolean still uses 1 byte in Postgres, though.