PostgreSQL-データ型
この章では、PostgreSQLで使用されるデータ型について説明します。テーブルの作成時に、列ごとにデータ型、つまりテーブルフィールドに保存するデータの種類を指定します。
これにより、いくつかの利点が得られます-
Consistency −同じデータ型の列に対する操作は一貫した結果をもたらし、通常は最速です。
Validation −データ型の適切な使用は、データのフォーマット検証とデータ型の範囲外のデータの拒否を意味します。
Compactness −列は単一のタイプの値を格納できるため、コンパクトな方法で格納されます。
Performance−データ型を適切に使用すると、データを最も効率的に保存できます。保存された値は迅速に処理できるため、パフォーマンスが向上します。
PostgreSQLは幅広いデータ型をサポートしています。さらに、ユーザーはCREATE TYPESQLコマンドを使用して独自のカスタムデータ型を作成できます。PostgreSQLにはさまざまなデータ型のカテゴリがあります。それらについては、以下で説明します。
数値タイプ
数値タイプは、2バイト、4バイト、および8バイトの整数、4バイトおよび8バイトの浮動小数点数、および選択可能な精度の小数で構成されます。次の表に、使用可能なタイプを示します。
名前 | ストレージサイズ | 説明 | 範囲 |
---|---|---|---|
smallint | 2バイト | 小範囲整数 | -32768〜 + 32767 |
整数 | 4バイト | 整数の典型的な選択 | -2147483648から+2147483647 |
bigint | 8バイト | 広い範囲の整数 | -9223372036854775808から9223372036854775807 |
10進数 | 変数 | ユーザー指定の精度、正確 | 小数点の前に最大131072桁。小数点以下16383桁まで |
数値 | 変数 | ユーザー指定の精度、正確 | 小数点の前に最大131072桁。小数点以下16383桁まで |
リアル | 4バイト | 可変精度、不正確 | 10進数の6桁の精度 |
倍精度 | 8バイト | 可変精度、不正確 | 10進数の15桁の精度 |
smallserial | 2バイト | 小さな自動インクリメント整数 | 1〜32767 |
シリアル | 4バイト | 自動インクリメント整数 | 1から2147483647 |
bigserial | 8バイト | 大きな自動インクリメント整数 | 1から9223372036854775807 |
通貨の種類
お金の種類は固定小数精度で通貨額を格納します。数値、整数、およびbigintデータ型の値は、moneyにキャストできます。丸め誤差が発生する可能性があるため、お金を処理するために浮動小数点数を使用することはお勧めしません。
名前 | ストレージサイズ | 説明 | 範囲 |
---|---|---|---|
お金 | 8バイト | 通貨額 | -92233720368547758.08〜 + 92233720368547758.07 |
文字の種類
以下の表に、PostgreSQLで使用可能な汎用文字タイプを示します。
S.いいえ。 | 名前と説明 |
---|---|
1 | character varying(n), varchar(n) 制限付きの可変長 |
2 | character(n), char(n) 固定長、ブランクパッド |
3 | text 可変長無制限 |
バイナリデータ型
bytea型のデータ・タイプは、下記の表のようにバイナリ文字列の保存を可能にします。
名前 | ストレージサイズ | 説明 |
---|---|---|
ビテア | 1バイトまたは4バイトと実際のバイナリ文字列 | 可変長バイナリ文字列 |
日付/時刻タイプ
PostgreSQLは、次の表に示すように、SQLの日付と時刻のタイプのフルセットをサポートしています。日付はグレゴリオ暦に従ってカウントされます。ここでは、すべてのタイプの解像度が1 microsecond / 14 digits を除いて date タイプ、その解像度は day。
名前 | ストレージサイズ | 説明 | 低い価値 | 高い価値 |
---|---|---|---|---|
タイムスタンプ[(p)] [タイムゾーンなし] | 8バイト | 日付と時刻の両方(タイムゾーンなし) | 紀元前4713年 | 294276 AD |
タイムスタンプツ | 8バイト | 日付と時刻の両方、タイムゾーン付き | 紀元前4713年 | 294276 AD |
日付 | 4バイト | 日付(時刻なし) | 紀元前4713年 | 5874897 AD |
時間[(p)] [タイムゾーンなし] | 8バイト | 時刻(日付なし) | 00:00:00 | 24:00:00 |
時間帯のある時間[(p)] | 12バイト | 時間帯のみの時間帯 | 00:00:00 + 1459 | 24:00:00-1459 |
間隔[フィールド] [(p)] | 12バイト | 時間間隔 | -17800 0000年 | 17800 0000年 |
ブール型
PostgreSQLは、標準のSQL型ブール値を提供します。ブールデータ型は、状態true、false、および3番目の状態unknownを持つことができ、SQLnull値で表されます。
名前 | ストレージサイズ | 説明 |
---|---|---|
ブール値 | 1バイト | 真または偽の状態 |
列挙型
列挙(列挙)型は、静的で順序付けられた値のセットを構成するデータ型です。これらは、多くのプログラミング言語でサポートされている列挙型と同等です。
他の型とは異なり、列挙型はCREATETYPEコマンドを使用して作成する必要があります。このタイプは、静的で順序付けられた値のセットを格納するために使用されます。たとえば、コンパスの方向、つまり、NORTH、SOUTH、EAST、WEST、または以下に示す曜日。
CREATE TYPE week AS ENUM ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
列挙されたものは、作成されると、他のタイプと同じように使用できます。
幾何学的タイプ
幾何学的データ型は、2次元の空間オブジェクトを表します。最も基本的なタイプであるポイントは、他のすべてのタイプの基礎を形成します。
名前 | ストレージサイズ | 表現 | 説明 |
---|---|---|---|
ポイント | 16バイト | 平面上のポイント | (x、y) |
ライン | 32バイト | 無限線(完全には実装されていません) | ((x1、y1)、(x2、y2)) |
lseg | 32バイト | 有限線分 | ((x1、y1)、(x2、y2)) |
ボックス | 32バイト | 長方形の箱 | ((x1、y1)、(x2、y2)) |
道 | 16 + 16nバイト | 閉じたパス(ポリゴンと同様) | ((x1、y1)、...) |
道 | 16 + 16nバイト | オープンパス | [(x1、y1)、...] |
ポリゴン | 40 + 16n | ポリゴン(閉じたパスに似ています) | ((x1、y1)、...) |
サークル | 24バイト | サークル | <(x、y)、r>(中心点と半径) |
ネットワークアドレスタイプ
PostgreSQLは、IPv4、IPv6、およびMACアドレスを格納するためのデータ型を提供します。これらのタイプは入力エラーチェックと特殊な演算子および関数を提供するため、プレーンテキストタイプの代わりにこれらのタイプを使用してネットワークアドレスを格納することをお勧めします。
名前 | ストレージサイズ | 説明 |
---|---|---|
cidr | 7または19バイト | IPv4およびIPv6ネットワーク |
inet | 7または19バイト | IPv4およびIPv6ホストとネットワーク |
macaddr | 6バイト | MACアドレス |
ビット文字列タイプ
ビット文字列タイプは、ビットマスクを格納するために使用されます。それらは0または1のいずれかです。2つのSQLビットタイプがあります。bit(n) そして bit varying(n)、ここで、nは正の整数です。
テキスト検索タイプ
このタイプは、全文検索をサポートします。これは、自然言語のドキュメントのコレクションを検索して、クエリに最適なドキュメントを見つけるアクティビティです。これには2つのデータ型があります-
S.いいえ。 | 名前と説明 |
---|---|
1 | tsvector これは、「語彙素」と呼ばれる、同じ単語のさまざまなバリアントをマージするために正規化された個別の単語のソートされたリストです。 |
2 | tsquery これは、検索される語彙素を格納し、ブール演算子&(AND)、|を尊重してそれらを結合します。(または !(NOT)。括弧を使用して、演算子のグループ化を強制できます。 |
UUIDタイプ
UUID(Universally Unique Identifiers)は、小文字の16進数のシーケンスとして、ハイフンで区切られたいくつかのグループ、具体的には8桁のグループ、4桁の3つのグループ、12桁のグループで記述されます。 128ビットを表す合計32桁。
UUIDの例は-550e8400-e29b-41d4-a716-446655440000です。
XMLタイプ
XMLデータ型は、XMLデータを格納するために使用できます。XMLデータを保存するには、まず次のように関数xmlparseを使用してXML値を作成する必要があります。
XMLPARSE (DOCUMENT '<?xml version="1.0"?>
<tutorial>
<title>PostgreSQL Tutorial </title>
<topics>...</topics>
</tutorial>')
XMLPARSE (CONTENT 'xyz<foo>bar</foo><bar>foo</bar>')
JSONタイプ
JSONのデータ・タイプは、JSON(JavaScriptオブジェクト表記)データを格納するために使用することができます。このようなデータはテキストとして保存することもできますが、jsonデータ型には、保存されている各値が有効なJSON値であることを確認できるという利点があります。次のように、JSONデータ型を直接処理するために使用できる関連するサポート関数も利用できます。
例 | 結果の例 |
---|---|
array_to_json( '{{1,5}、{99,100}}' :: int []) | [[1,5]、[99,100]] |
row_to_json(row(1、 'foo')) | {"f1":1、 "f2": "foo"} |
配列タイプ
PostgreSQLは、テーブルの列を可変長の多次元配列として定義する機会を提供します。組み込み型またはユーザー定義の基本型、列挙型、または複合型の配列を作成できます。
配列の宣言
配列型は次のように宣言できます
CREATE TABLE monthly_savings (
name text,
saving_per_quarter integer[],
scheme text[][]
);
またはキーワード「ARRAY」を使用して
CREATE TABLE monthly_savings (
name text,
saving_per_quarter integer ARRAY[4],
scheme text[][]
);
値の挿入
配列値はリテラル定数として挿入でき、要素値を中括弧で囲み、コンマで区切ります。例を以下に示します-
INSERT INTO monthly_savings
VALUES (‘Manisha’,
‘{20000, 14600, 23500, 13250}’,
‘{{“FD”, “MF”}, {“FD”, “Property”}}’);
配列へのアクセス
配列にアクセスする例を以下に示します。以下のコマンドは、第4四半期よりも第2四半期の方が貯蓄が多い人を選択します。
SELECT name FROM monhly_savings WHERE saving_per_quarter[2] > saving_per_quarter[4];
配列の変更
配列を変更する例を以下に示します。
UPDATE monthly_savings SET saving_per_quarter = '{25000,25000,27000,27000}'
WHERE name = 'Manisha';
またはARRAY式の構文を使用する-
UPDATE monthly_savings SET saving_per_quarter = ARRAY[25000,25000,27000,27000]
WHERE name = 'Manisha';
配列の検索
配列の検索例を以下に示します。
SELECT * FROM monthly_savings WHERE saving_per_quarter[1] = 10000 OR
saving_per_quarter[2] = 10000 OR
saving_per_quarter[3] = 10000 OR
saving_per_quarter[4] = 10000;
配列のサイズがわかっている場合は、上記の検索方法を使用できます。それ以外の場合、次の例は、サイズが不明な場合に検索する方法を示しています。
SELECT * FROM monthly_savings WHERE 10000 = ANY (saving_per_quarter);
複合型
このタイプは、フィールド名とそのデータタイプのリスト、つまり、テーブルの行またはレコードの構造を表します。
複合型の宣言
次の例は、複合型を宣言する方法を示しています
CREATE TYPE inventory_item AS (
name text,
supplier_id integer,
price numeric
);
このデータ型は、以下のようにテーブルの作成で使用できます。
CREATE TABLE on_hand (
item inventory_item,
count integer
);
複合値入力
複合値はリテラル定数として挿入でき、フィールド値を括弧で囲み、コンマで区切ります。例を以下に示します-
INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);
これは、上記で定義したinventory_itemに対して有効です。式に複数のフィールドがある限り、ROWキーワードは実際にはオプションです。
複合型へのアクセス
複合列のフィールドにアクセスするには、テーブル名からフィールドを選択するのと同じように、ドットの後にフィールド名を使用します。たとえば、on_handサンプルテーブルからいくつかのサブフィールドを選択する場合、クエリは次のようになります。
SELECT (item).name FROM on_hand WHERE (item).price > 9.99;
次のように、テーブル名を使用することもできます(たとえば、マルチテーブルクエリで)。
SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;
レンジタイプ
範囲タイプは、データの範囲を使用するデータ型を表します。範囲タイプは、離散範囲(たとえば、すべての整数値1から10)または連続範囲(たとえば、午前10時から午前11時までの任意の時点)にすることができます。
利用可能な組み込みの範囲タイプには、次の範囲が含まれます-
int4range −整数の範囲
int8range −bigintの範囲
numrange −数値の範囲
tsrange −タイムゾーンのないタイムスタンプの範囲
tstzrange −タイムゾーン付きのタイムスタンプの範囲
daterange −日付の範囲
カスタム範囲タイプを作成して、inetタイプをベースとして使用するIPアドレス範囲や、floatデータタイプをベースとして使用するfloat範囲など、新しいタイプの範囲を使用可能にすることができます。
範囲タイプは、それぞれ[]文字と()文字を使用した包括的および排他的範囲境界をサポートします。たとえば、「[4,9)」は、4から9までのすべての整数を表します。
オブジェクト識別子の種類
オブジェクト識別子(OID)は、さまざまなシステムテーブルの主キーとしてPostgreSQLによって内部的に使用されます。場合WITH OIDSが指定されているか、default_with_oidsの構成変数が有効になっている、だけにして、このような場合にOIDは、ユーザ作成のテーブルに追加されます。次の表に、いくつかのエイリアスタイプを示します。OIDエイリアスタイプには、特殊な入力および出力ルーチンを除いて、独自の操作はありません。
名前 | 参考文献 | 説明 | 値の例 |
---|---|---|---|
oid | どれか | 数値オブジェクト識別子 | 564182 |
regproc | pg_proc | 関数名 | 和 |
regprocedure | pg_proc | 引数型の関数 | sum(int4) |
regoper | pg_operator | オペレーター名 | + |
regoperator | pg_operator | 引数型の演算子 | *(integer、integer)または-(NONE、integer) |
regclass | pg_class | 関係名 | pg_type |
regtype | pg_type | データ型名 | 整数 |
regconfig | pg_ts_config | テキスト検索構成 | 英語 |
regdictionary | pg_ts_dict | テキスト検索辞書 | シンプル |
疑似タイプ
PostgreSQL型システムには、まとめて疑似型と呼ばれるいくつかの特別な目的のエントリが含まれています。疑似型は列データ型として使用できませんが、関数の引数または結果型を宣言するために使用できます。
以下の表に、既存の疑似タイプを示します。
S.いいえ。 | 名前と説明 |
---|---|
1 | any 関数が任意の入力データ型を受け入れることを示します。 |
2 | anyelement 関数が任意のデータ型を受け入れることを示します。 |
3 | anyarray 関数が任意の配列データ型を受け入れることを示します。 |
4 | anynonarray 関数が配列以外のデータ型を受け入れることを示します。 |
5 | anyenum 関数が任意の列挙型データ型を受け入れることを示します。 |
6 | anyrange 関数が任意の範囲データ型を受け入れることを示します。 |
7 | cstring 関数がnullで終了するC文字列を受け入れるか返すことを示します。 |
8 | internal 関数がサーバー内部のデータ型を受け入れるか返すことを示します。 |
9 | language_handler 手続き型言語の呼び出しハンドラーは、language_handlerを返すように宣言されています。 |
10 | fdw_handler 外部データラッパーハンドラーは、fdw_handlerを返すように宣言されています。 |
11 | record 不特定の行タイプを返す関数を識別します。 |
12 | trigger トリガー関数は、トリガーを返すように宣言されています。 |
13 | void 関数が値を返さないことを示します。 |