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


14

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

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

回答:


15

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

拡張pguint

しかし、はい。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直接キャストして両方の問題を修正してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.