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 が指定されたものと見なされる。また、precisionscale の両方を省略した場合は、可能な最大精度および小数点以下の桁数が設定される。

たとえば、次のようなテーブルを作成する。

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.24532.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.44756589.44756652.7512002456865245652.751200245686526 に丸められて保存された。

範囲を超える値を保存しようとするとエラーが発生する。たとえば、次のような値を保存しようとする。

mydb=# insert into numtest3 values (4.8e50, 4.8e50);
エラー:  "480000000000000000000000000000000000000000000000000" は real 型の範囲を超えています。
mydb=#

保存できる値の範囲を超えた値を保存しようとしたため、範囲外であるというエラーが発生した。

PostgreSQL で使用できるデータ型のうち、数値型の使い方について説明した。