Postgresql-data-types
PostgreSQL-データ型
この章では、PostgreSQLで使用されるデータ型について説明します。 テーブルの作成中に、各列にデータ型、つまりテーブルフィールドに保存するデータの種類を指定します。
これはいくつかの利点を可能にします-
- 一貫性-同じデータ型の列に対する操作は一貫した結果をもたらし、通常は最速です。
- 検証-データ型の適切な使用は、データの形式検証とデータ型の範囲外のデータの拒否を意味します。
- コンパクト-列は単一のタイプの値を格納できるため、コンパクトな方法で格納されます。
- パフォーマンス-データ型を適切に使用すると、データを最も効率的に保存できます。 格納された値は迅速に処理できるため、パフォーマンスが向上します。
PostgreSQLは幅広いデータ型をサポートしています。 また、ユーザーは_CREATE TYPE_ SQLコマンドを使用して独自のカスタムデータ型を作成できます。 PostgreSQLには、データ型のさまざまなカテゴリがあります。 以下で説明します。
数値型
数値型は、2バイト、4バイト、および8バイトの整数、4バイトと8バイトの浮動小数点数、および選択可能な精度の小数で構成されます。 次の表に、使用可能なタイプを示します。
Name | Storage Size | Description | Range |
---|---|---|---|
smallint | 2 bytes | small-range integer | -32768 to +32767 |
integer | 4 bytes | typical choice for integer | -2147483648 to +2147483647 |
bigint | 8 bytes | large-range integer | -9223372036854775808 to 9223372036854775807 |
decimal | variable | user-specified precision,exact | up to 131072 digits before the decimal point; up to 16383 digits after the decimal point |
numeric | variable | user-specified precision,exact | up to 131072 digits before the decimal point; up to 16383 digits after the decimal point |
real | 4 bytes | variable-precision,inexact | 6 decimal digits precision |
double precision | 8 bytes | variable-precision,inexact | 15 decimal digits precision |
smallserial | 2 bytes | small autoincrementing integer | 1 to 32767 |
serial | 4 bytes | autoincrementing integer | 1 to 2147483647 |
bigserial | 8 bytes | large autoincrementing integer | 1 to 9223372036854775807 |
通貨タイプ
_money_タイプは、固定小数精度で通貨額を格納します。 _numeric、int、およびbigint_データ型の値は、_money_にキャストできます。 丸めエラーが発生する可能性があるため、お金を扱うために浮動小数点数を使用することはお勧めしません。
Name | Storage Size | Description | Range |
---|---|---|---|
money | 8 bytes | currency amount | -92233720368547758.08 to +92233720368547758.07 |
キャラクタータイプ
以下の表は、PostgreSQLで使用可能な汎用文字タイプを示しています。
S. No. | Name & Description |
---|---|
1 |
character varying(n), varchar(n) 制限付き可変長 |
2 |
character(n), char(n) 固定長、空白埋め |
3 |
text 可変長 |
バイナリデータタイプ
_bytea_データ型を使用すると、以下の表のようにバイナリ文字列を保存できます。
Name | Storage Size | Description |
---|---|---|
bytea | 1 or 4 bytes plus the actual binary string | variable-length binary string |
日付/時刻型
PostgreSQLは、以下の表に示すように、SQLの日付と時刻の完全なセットをサポートしています。 日付はグレゴリオ暦に従ってカウントされます。 ここでは、解像度が day である date タイプを除くすべてのタイプの解像度は* 1マイクロ秒/14桁*です。
Name | Storage Size | Description | Low Value | High Value |
---|---|---|---|---|
timestamp [(p)] [without time zone ] | 8 bytes | both date and time (no time zone) | 4713 BC | 294276 AD |
TIMESTAMPTZ | 8 bytes | both date and time, with time zone | 4713 BC | 294276 AD |
date | 4 bytes | date (no time of day) | 4713 BC | 5874897 AD |
time [ (p)] [ without time zone ] | 8 bytes | time of day (no date) | 00:00:00 | 24:00:00 |
time [ (p)] with time zone | 12 bytes | times of day only, with time zone | 00:00:00+1459 | 24:00:00-1459 |
interval [fields ] [(p) ] | 12 bytes | time interval | -178000000 years | 178000000 years |
ブール型
PostgreSQLは、標準SQL型のブール値を提供します。 ブールデータ型には、状態_true 、 false_、およびSQL null値で表される3番目の状態_unknown_を含めることができます。
Name | Storage Size | Description |
---|---|---|
boolean | 1 byte | state of true or false |
列挙型
列挙型(列挙型)は、静的な順序付けられた値のセットで構成されるデータ型です。 これらは、多くのプログラミング言語でサポートされている列挙型と同等です。
他の型とは異なり、列挙型はCREATE TYPEコマンドを使用して作成する必要があります。 このタイプは、静的な順序付けられた値のセットを格納するために使用されます。 たとえば、コンパスの方向、すなわち、北、南、東、西、または以下に示す曜日-
CREATE TYPE week AS ENUM ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
作成された列挙型は、他の型と同様に使用できます。
幾何学的タイプ
幾何データ型は、2次元の空間オブジェクトを表します。 最も基本的なタイプであるポイントは、他のすべてのタイプの基礎を形成します。
Name | Storage Size | Representation | Description |
---|---|---|---|
point | 16 bytes | Point on a plane | (x,y) |
line | 32 bytes | Infinite line (not fully implemented) | x1,y1),(x2,y2x1,y1),(x2,y2 |
lseg | 32 bytes | Finite line segment | x1,y1),(x2,y2x1,y1),(x2,y2 |
box | 32 bytes | Rectangular box | x1,y1),(x2,y2x1,y1),(x2,y2 |
path | 16+16n bytes | Closed path (similar to polygon) | ((x1,y1),…) |
path | 16+16n bytes | Open path | [(x1,y1),…] |
polygon | 40+16n | Polygon (similar to closed path) | ((x1,y1),…) |
circle | 24 bytes | Circle | <(x,y),r> (center point and radius) |
ネットワークアドレスタイプ
PostgreSQLは、IPv4、IPv6、およびMACアドレスを保存するデータ型を提供します。 これらのタイプは入力エラーチェックと特殊な演算子と機能を提供するため、プレーンテキストタイプの代わりにこれらのタイプを使用してネットワークアドレスを保存する方が適切です。
Name | Storage Size | Description |
---|---|---|
cidr | 7 or 19 bytes | IPv4 and IPv6 networks |
inet | 7 or 19 bytes | IPv4 and IPv6 hosts and networks |
macaddr | 6 bytes | MAC addresses |
ビット列タイプ
ビット文字列型は、ビットマスクを格納するために使用されます。 0または1のいずれかです。 SQLビットタイプには、* bit(n)と bit changing(n)*の2種類があります。nは正の整数です。
テキスト検索タイプ
このタイプは全文検索をサポートします。これは、自然言語ドキュメントのコレクションを検索して、クエリに最も一致するドキュメントを見つけるアクティビティです。 これには2つのデータ型があります-
S. No. | Name & Description |
---|---|
1 |
tsvector これは、「語彙素」と呼ばれる同じ単語の異なる変形をマージするために正規化された個別の単語のソートされたリストです。 |
2 |
tsquery これは、検索される語彙素を保存し、それらを結合してブール演算子&(AND)、 |
UUIDタイプ
UUID(Universally Unique Identifiers)は、ハイフンで区切られたいくつかのグループ、具体的には8桁のグループ、4桁の3つのグループ、12桁のグループが続く、一連の小文字の16進数として書き込まれます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 Object Notation)データを保存できます。 このようなデータは_text_として保存することもできますが、_json_データ型には、保存されている各値が有効なJSON値であることを確認するという利点があります。 また、関連するサポート関数も利用できます。これらの関数は、次のようにJSONデータ型を直接処理するために使用できます。
Example | Example Result |
---|---|
array_to_json('\{\{1,5},\{99,100}}'::int[]) | [[row_to_json(row(1,'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:00から午前11:00までの任意の時点)です。
利用可能な組み込みの範囲タイプには、次の範囲が含まれます-
- int4range -整数の範囲
- int8range -bigintの範囲
- numrange -数値の範囲
- tsrange -タイムゾーンのないタイムスタンプの範囲
- tstzrange -タイムゾーン付きのタイムスタンプの範囲
- daterange -日付の範囲
カスタム範囲タイプを作成して、inetタイプをベースとして使用するIPアドレス範囲、floatデータタイプをベースとして使用するfloat範囲など、新しいタイプの範囲を使用可能にすることができます。
範囲タイプは、それぞれ[]および()文字を使用した包括的および排他的範囲境界をサポートします。 たとえば、「[4,9)」は、4から9までのすべての整数を表します。
オブジェクト識別子のタイプ
オブジェクト識別子(OID)は、さまざまなシステムテーブルの主キーとしてPostgreSQLによって内部的に使用されます。 _WITH OIDS_が指定されている場合、または_default_with_oids_構成変数が有効になっている場合のみ、そのような場合にOIDがユーザー作成のテーブルに追加されます。 次の表に、いくつかのエイリアスタイプを示します。 OIDエイリアスタイプには、特殊な入力および出力ルーチンを除き、独自の操作はありません。
Name | References | Description | Value Example |
---|---|---|---|
oid | any | numeric object identifier | 564182 |
regproc | pg_proc | function name | sum |
regprocedure | pg_proc | function with argument types | sum(int4) |
regoper | pg_operator | operator name | + |
regoperator | pg_operator | operator with argument types | *(integer,integer) or -(NONE,integer) |
regclass | pg_class | relation name | pg_type |
regtype | pg_type | data type name | integer |
regconfig | pg_ts_config | text search configuration | English |
regdictionary | pg_ts_dict | text search dictionary | simple |
疑似タイプ
PostgreSQLタイプシステムには、集合的に疑似タイプと呼ばれる特別な目的のエントリが多数含まれています。 疑似型は列データ型として使用できませんが、関数の引数または結果型を宣言するために使用できます。
以下の表に、既存の疑似タイプをリストします。
S. No. | Name & Description |
---|---|
1 |
any 関数が入力データ型を受け入れることを示します。 |
2 |
anyelement 関数が任意のデータ型を受け入れることを示します。 |
3 |
anyarray 関数が配列データ型を受け入れることを示します。 |
4 |
anynonarray 関数が配列以外のデータ型を受け入れることを示します。 |
5 |
anyenum 関数が列挙データ型を受け入れることを示します。 |
6 |
anyrange 関数が範囲データ型を受け入れることを示します。 |
7 |
cstring 関数がヌル終了C文字列を受け入れるか返すことを示します。 |
8 |
internal 関数がサーバー内部データ型を受け入れるか返すことを示します。 |
9 |
language_handler 手続き言語呼び出しハンドラーは、language_handlerを返すように宣言されています。 |
10 |
fdw_handler 外部データラッパーハンドラーは、fdw_handlerを返すように宣言されています。 |
11 |
record 未指定の行タイプを返す関数を識別します。 |
12 |
trigger トリガーを返すようにトリガー関数が宣言されています。 |
13 |
void 関数が値を返さないことを示します。 |