数値データ型

PosgtreSQL で利用できるデータ型の中で数値型の使い方について解説します。数値型には整数データ型(smallint, integer, bigint)、任意の精度を持つ数(numeric, decimal)、浮動小数点データ型(real, double precision)が含まれます。連番型は次のページで解説します。

(Last modified: )

整数データ型

最初に整数データ型です。扱える数の範囲が異なる 3 つのデータ型があります。

smallint
2バイト
-32768から+32767
別名:int2

integer
4バイト
-2147483648から+2147483647
別名:int, int4

bigint
8バイト
-9223372036854775808から+9223372036854775807
別名:int8

整数ですので小数点がある数値は扱うことができません。小数点がある数値を格納しようとすると整数に変換されて格納されます。また各データ型には格納できる値の範囲が決まっており、範囲を超えた数値を格納しようとするとエラーとなります。

例として次のようなテーブルを作成しました。

create table numtest (num1 smallint, num2 integer, num3 bigint);

整数データ型(1)

それぞれのカラムに設定されているデータ型の範囲内の値であれば格納することができます。例えば次のようなデータを格納します。

insert into numtest values (8000, 350000, 4000000000);

整数データ型(2)

範囲を超える値を格納しようとするとエラーとなります。例えば num1 カラムは smallint 型なので格納できる値の範囲は -32768 から +32767 までです。この値を超える 50000 のような値を格納してみます。

insert into numtest values (50000, 50000, 50000);

整数データ型(3)

num1 カラムに格納できる値の範囲を超えた値を格納しようとしたため ERROR: smallintの範囲外です というエラーとなりました。

任意の精度を持つ数

次に任意の精度を持つ数です。

numeric
可変長
ユーザ指定精度、正確
小数点より上は131072桁まで、小数点より下は16383桁まで
別名: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 の両方が省略された場合は可能な限り最大の精度および小数点以下の桁数が設定されます。

例として次のようなテーブルを作成しました。

create table numtest (num numeric(5, 2));

任意の精度を持つ数(1)

カラムに設定されているデータ型の範囲内の値であれば格納することができます。例えば次のような 3 つのデータを格納します。

insert into numtest values (45), (34.25), (-752.4);

任意の精度を持つ数(2)

整数部分の範囲を超える値を格納しようとするとエラーとなります。例えば num カラムは numeric(5, 2) 型なので格納できる値の範囲は -999.99 から +999.99 までです。この値を超える 1500.2 のような値を格納してみます。

insert into numtest values (1500.2);

任意の精度を持つ数(3)

num カラムに格納できる値の範囲を超えた値を格納しようとしたため ERROR: numericフィールドのオーバーフロー というエラーとなりました。

小数点以下の桁数が指定した範囲を超えた場合はエラーとはならずに指定の桁数に変換されて格納されます。例えば次のような値を 2 つ格納してみます。

insert into numtest values (32.245),(-8.5224);

任意の精度を持つ数(4)

32.245 は 32.5 として、また -8.5224 は -8.52 として格納されました。

浮動小数点データ型

最後に浮動小数点データ型です。扱える数の範囲が異なる 2 つのデータ型があります。

real
4バイト
可変精度、不正確
最低6桁の精度 (少なくとも1E-37から1E+37)
別名:float4

double precision
8バイト
可変精度、不正確
最低15桁の精度 (およそ1E-307から1E+308)
別名:float8

浮動小数点数では格納したり取り出したりするときに誤差が生じる可能性があるので、正確な演算などには向いていません。

例として次のようなテーブルを作成しました。

create table numtest (num1 real, num2 double precision);

浮動小数点データ型(1)

カラムに設定されているデータ型の範囲内の値であれば格納することができます。例えば次のようなデータを格納します。

insert into numtest values (15.775, 812.5532245);

浮動小数点データ型(2)

それぞれのデータ型を超える桁数の値を格納しようとすると丸められて格納されることがあります。例えば次のようなデータを格納します。

insert into numtest values (9.4475658, 52.75120024568652456);

浮動小数点データ型(3)

9.4475658 は 9.44757 へ、また 52.75120024568652456 は 52.7512002456865 へ丸められて格納されています。

範囲を超える値を格納しようとするとエラーとなります。例えば次のような値を格納してみます。

insert into numtest values (4.8e50, 4.8e50);

浮動小数点データ型(3)

格納できる値の範囲を超えた値を格納しようとしたため ERROR: 範囲外の値です: オーバーフロー というエラーとなりました。

-- --

PosgtreSQL で利用できるデータ型の中で数値型の使い方について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。