web-dev-qa-db-ja.com

PostgreSQLに1バイト整数を格納する方法は?

PostgreSQLのドキュメントでは、 整数データ型 は2バイト、4バイト、または8バイトのスペースに格納できると言われています。データベースのテーブルの列の1つに1バイトの整数値が含まれていて、それを1バイトのデータ型で格納したい。

  1. PostgreSQLで1バイト整数データ型を使用する拡張機能または方法はありますか?
  2. NUMERIC(1,0)は何バイトですか?
14
ukll

いいえ、Postgresの標準ディストリビューションには1バイト整数はありません。すべて 標準Postgresの組み込み数値型 は2バイト以上を占めます。

拡張pguint

しかしyesextensionpguint があります=、Postgresコア開発者の1人であるPeter Eisentrautによって保守されています。これは標準ディストリビューションの一部ではありません:

さまざまな符号なし整数型に加えて、探している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)

リンク先のサイトの「ディスカッション」の章を読み、起こりうる合併症について説明してください。整数型を追加する場合は、型キャストと数値リテラルに注意する必要があります...

Workaround

可能な単純な回避策は、1バイトの整数値を "char" 、「内部」の単純な1文字タイプで、実際には1バイトのストレージを使用し、符号付き1-のバイト値バイト整数、上半分はASCII文字として表されます。

-128から127の範囲の値をエンコードできます。デモ:

SELECT i
     , i::"char"
     , i::"char"::int
FROM   generate_series(-128,127) i;

表示用ではない文字がいくつかあります。したがって、保存する前にencodeを表示し、表示する前にdecode...

覚えておいてください:"char"は、単純で安価な列挙を目的とした「内部」タイプです。ここでの作業用に公式に設計されたものではなく、他のRDBMSに移植できません。これに対するPostgresプロジェクトによる保証はありません。

私の最初の提案は、符号なし1バイト整数(0〜255)の範囲をカバーし、textを踏み台として使用できるという想定に不注意で基づいていました。 Evanは私のやり方の誤りを指摘しました:それは1から127までの数でのみ機能し、残りの部分では失敗します。代わりに、整数の範囲-128〜127を使用し、"char"およびintegerを直接使用して、両方の問題を修正します。

16