回答:
いいえ、Postgresの標準ディストリビューションには1バイト整数はありません。標準Postgresのすべての組み込み数値型は 2バイト以上を占めます。
しかし、はい。Postgresコア開発者の1人であるPeter Eisentrautによって保守されている拡張pguintがあります。これは標準ディストリビューションの一部ではありません:
さまざまな符号なし整数型に加えて、探している1バイト整数も提供します。
int1 (signed 8-bit integer)
uint1 (unsigned 8-bit integer)
uint2 (unsigned 16-bit integer)
uint4 (unsigned 32-bit integer)
uint8 (unsigned 64-bit integer)
リンク先のサイトの「ディスカッション」の章を読み、起こりうる合併症について説明してください。整数型を追加する場合は、型キャストと数値リテラルに注意する必要があります...
可能な単純な回避策は、1バイト整数値をとしてエンコードすることです"char"
。これは、実際には1バイトのストレージ、符号付き1バイト整数のバイト値、上半分はASCII文字。
-128〜127の範囲の値をエンコードできます。デモ:
SELECT i
, i::"char"
, i::"char"::int
FROM generate_series(-128,127) i;
表示用ではない文字がいくつかあります。したがって、保存する前にエンコードし、表示する前にデコードします...
覚えておいてください:"char"
は単純で安価な列挙を目的とした「内部」タイプです。ここで行うことのために公式に設計されておらず、他のRDBMSに移植できません。このためのPostgresプロジェクトによる保証はありません。
私の最初の提案は、符号なし1バイト整数(0〜255)の範囲をカバーし、text
踏み台として使用できるという想定に不注意で基づいていました。Evanは私のやり方の誤りを指摘しました:それは1から127の数に対してのみ機能し、残りのために失敗します。代わりに、整数の範囲-128から127を使用し、両方の間"char"
でinteger
直接キャストして両方の問題を修正してください。