PostgreSQL | データ型(Data type) | 数値型(integer, decimal, double precision など)
PostgreSQL で使用できるデータ型のうち、数値型の使い方について説明する。数値には整数データ型 (smallint, integer, bigint)、正確な数値 (numeric, decimal)、浮動小数点データ型 (real, double precision) が含まれる。自動増加型は次のページで説明する。
整数型 (smallint, integer, bigint)
まず整数データ型である。扱える数値の範囲が異なる 3 種類のデータ型がある。
| 型 | サイズ | 範囲 | 別名 |
|---|---|---|---|
| smallint | 2 バイト | -32768 から +32767 | int2 |
| integer | 4 バイト | -2147483648 から +2147483647 | int, int4 |
| bigint | 8 バイト | -9223372036854775808 から +9223372036854775807 | int8 |
整数なので、小数点を持つ数値は扱えない。小数点を持つ数値を保存すると、整数に変換されて保存される。また、各データ型には保存できる値の範囲が決まっており、範囲を超えた値を保存しようとするとエラーが発生する。
たとえば、次のようなテーブルを作成する。
mydb=# create table numtest1 (num1 smallint, num2 integer, num3 bigint);
CREATE TABLE
mydb=#
各カラムに設定されているデータ型の範囲内の値であれば保存できる。たとえば、次のようなデータを保存する。
mydb=# insert into numtest1 values (8000, 350000, 4000000000);
INSERT 0 1
mydb=#
範囲を超える値を保存しようとするとエラーが発生する。たとえば、num1 カラムは smallint 型なので、保存できる値の範囲は -32768 から +32767 までである。この値を超える 50000 を保存しようとする。
mydb=# insert into numtest1 values (50000, 50000, 50000);
エラー: smallint の範囲を超えています。
mydb=#
num1 カラムに保存できる値の範囲を超えた値を保存しようとしたため、「smallint の範囲を超えています」というエラーが発生した。
正確な数値 (numeric, decimal)
次は正確な数値である。
| 型 | サイズ | 特徴 | 範囲 | 別名 |
|---|---|---|---|---|
| numeric | 可変 | ユーザー指定、正確 | 小数点の上は 131072 桁まで、小数点の下は 16,383 桁まで | decimal |
numeric および decimal 型は非常に大きな数値を保存でき、演算しても誤差が発生せず正確に扱えるデータ型である。ただし、処理は整数や浮動小数点データ型と比べて非常に遅くなるため注意が必要である。
numeric 型は次の形式で指定する。
NUMERIC(precision, scale) NUMERIC(precision) NUMERIC
precision は数値全体の最大精度、scale は小数点以下の桁数を指定する。たとえば numeric(5, 2) とすると、小数点以下 2 桁、全体 5 桁の精度の値を保存できるため、保存できる値の範囲は -999.99 から 999.99 になる。
scale を省略すると 0 が指定されたものと見なされる。また、precision と scale の両方を省略した場合は、可能な最大精度および小数点以下の桁数が設定される。
たとえば、次のようなテーブルを作成する。
mydb=# create table numtest2 (num numeric(5, 2));
CREATE TABLE
mydb=#
カラムに設定されているデータ型の範囲内の値であれば保存できる。たとえば、次の 3 つのデータを保存する。
mydb=# insert into numtest2 values (45), (34.25), (-752.4);
INSERT 0 3
mydb=#
整数部分の範囲を超える値を保存しようとするとエラーが発生する。たとえば、num カラムは numeric(5, 2) 型なので、保存できる値の範囲は -999.99 から +999.99 までである。この値を超える 1500.2 を保存しようとする。
mydb=# insert into numtest2 values (1500.2);
エラー: 数値フィールドのオーバーフロー
詳細: 全体桁数 5、小数桁数 2 のフィールドは、10^3 より小さい絶対値に丸められる必要があります。
mydb=#
num カラムに保存できる値の範囲を超えた値を保存したため、「数値フィールドのオーバーフロー」エラーが発生する。
小数点以下の桁数が指定した範囲を超える場合はエラーにならず、指定された桁数に変換されて保存される。たとえば、次のような値を 2 つ追加してみる。
mydb=# insert into numtest2 values (32.245),(-8.5224);
INSERT 0 2
mydb=# select * from numtest2;
num
---------
45.00
34.25
-752.40
32.25
-8.52
(5 行)
mydb=#
32.245 は 32.25、-8.5224 は -8.52 として保存された。
浮動小数点データ型 (real, double precision)
最後に浮動小数点データ型である。扱える数値の範囲が異なる 2 種類のデータ型がある。
| 型 | サイズ | 特徴 | 範囲 | 別名 |
|---|---|---|---|---|
| real | 4 バイト | 可変精度、不正確 | 最低 6 桁の精度、少なくとも 1E-37 から 1E+37 | float4 |
| double precision | 8 バイト | 可変精度、不正確 | 最低 15 桁の精度、約 1E-307 から 1E+308 | float8 |
浮動小数点では保存や取得の際に誤差が発生する場合があるため、正確な演算などには適していない。
たとえば、次のようなテーブルを作成する。
mydb=# create table numtest3 (num1 real, num2 double precision);
CREATE TABLE
mydb=#
カラムに設定されているデータ型の範囲内の値であれば保存できる。たとえば、次のようなデータを保存する。
mydb=# insert into numtest3 values (15.775, 812.5532245);
INSERT 0 1
mydb=# select * from numtest3;
num1 | num2
----------+--------------------
15.775 | 812.5532245
(1 行)
mydb=#
各データ型で扱える桁数以上の値を保存しようとすると、丸められて保存される場合がある。たとえば、次のようなデータを保存する。
mydb=# insert into numtest3 values (9.4475658, 52.75120024568652456);
INSERT 0 1
mydb=# select * from numtest3;
num1 | num2
----------+--------------------
15.775 | 812.5532245
9.447566 | 52.751200245686526
(2 行)
mydb=#
9.4475658 は 9.447566、52.75120024568652456 は 52.751200245686526 に丸められて保存された。
範囲を超える値を保存しようとするとエラーが発生する。たとえば、次のような値を保存しようとする。
mydb=# insert into numtest3 values (4.8e50, 4.8e50);
エラー: "480000000000000000000000000000000000000000000000000" は real 型の範囲を超えています。
mydb=#
保存できる値の範囲を超えた値を保存しようとしたため、範囲外であるというエラーが発生した。
–
PostgreSQL で使用できるデータ型のうち、数値型の使い方について説明した。