スペースを節約したい場合は、"char"
データ型を使用できます。 1バイトを格納します。
integer
またはtext
を"char"
にキャストできます。
SELECT 'u'::"char", 'd'::"char", 'n'::"char";
char | char | char
------+------+------
u | d | n
(1 row)
Enumは内部的にreal
として格納されるため、4バイトを使用します。
スペースを節約するために何をしているのか、alignmentを考慮する必要があります。値は常にtype alignmentに従って整列されます。たとえば、bigint
は常に8で割り切れるアドレスから開始する必要があります。
テーブルが次のように定義されている場合
CREATE TABLE (
smallflag "char",
largenum bigint
);
列の間に7 パディングバイトがあり、"char"
mootからのすべてのスペースの増加をレンダリングします。
したがって、テーブルの列を慎重に配置してください。
少しハックですが、列をnull可能にしても、3番目の値としてnull値を使用してブール値を使用できます。
ただし、ブールはPostgresで引き続き1バイトを使用します。
-128から127までの整数を1バイトのスペースに格納できるtinyint拡張機能がありますが、現在postgresバージョン11以降と互換性を持たせるには、書き換えが必要です。
https://github.com/umitanuki/tinyint-postgresql
このデータ型がメインのPostgres型でまだ利用できない理由は、常に私には謎でした。