【PostgreSQL】代表的な数値型の型について整理してみました

PostgreSQLその他

integer型

integerとは

integerは、整数値を保存できる型です。(小数値は保存不可)

 

integerは4バイト(=32bit)のため、2の32乗 - 1 の数を表すことができます。

2の32乗 -1  =  4,294,967,296 - 1  =  4,294,967,295

※ -1するのは0からカウントするためです。

また+とーの値をとるため、最小値は-2,147,483,648。最大値は2,147,483,647となります。

 

実際に動作を確認(PostgreSQL12)してみると以下の結果になります。

・小数を登録しようとした時、エラーにはならず小数点以下は四捨五入される

・文字列の整数を登録しようとした時、整数は問題なし、小数はエラーとなる

・範囲外の数を登録しようとした時、エラーとなる

・数式で登録しようとした時、特に問題なし

-- 動作確認。(select文のため、そのままコピーしすぐ実行できるようになっています)

-- 1.小数を登録しようとした時、小数点以下は四捨五入される
select cast(2.4 as integer);               -- 結果: 2
select cast(2.5 as integer);               -- 結果: 3

-- 2.文字列の整数を登録しようとした時、整数は問題なし、小数はエラーとなる
select cast('2' as integer);               -- 結果: 2
select cast('2.4' as integer);             -- 結果: エラー

-- 3.範囲外の数を登録しようとした時、エラーとなる
select cast(-2147483649 as integer);       -- 結果: エラー
select cast(2147483648 as integer);        -- 結果: エラー

-- 4.数式で登録しようとした時、特に問題なし
select cast(2 + 3 as integer);             -- 結果: 5
select cast(2 + 3.5 as integer);           -- 結果: 6

 

 

smallint型、bigint型

smallint、bigintとは

smallint、bigintは、integerと同じく整数値を保存できる型です。(小数値は保存不可)

 

smallintは2バイト(16bit)のため、2の16乗 - 1 の数を表すことができます。

2の16乗 -1  =  65,536 - 1  =  65,535

※ -1するのは0からカウントするためです。

また+とーの値をとるため、最小値は-32,768。最大値は32,767となります。

 

bigintは8バイト(64bit)のため、2の64乗 - 1 の数を表すことができます。

2の64乗 -1  =  18,446,744,073,709,551,616 - 1  =  18,446,744,073,709,551,615 (1,844京)

※ -1するのは0からカウントするためです。

また+とーの値をとるため、最小値は-9,223,372,036,854,775,808

最大値は9,223,372,036,854,775,807となります。

 

PostgreSQL文書には、smallint型は通常はディスク容量に制限が付いている場合に使用し、

bigint型はintegerの範囲を超える場合に使用します。みたいなことが書いてありましたが、

ほぼほぼintegerで事足りるので、登場する機会はあまりないように感じます。

 

念のため実際に動作を確認(PostgreSQL12)してみます。

※ 最小値、最大値の値が変わる以外は動作に変わりはありません。

-- 動作確認(smallint)
-- select文のため、そのままコピーしすぐ実行できるようになっています

-- 1.小数を登録しようとした時、小数点以下は四捨五入される
select cast(2.4 as smallint);               -- 結果: 2
select cast(2.5 as smallint);               -- 結果: 3

-- 2.文字列の整数を登録しようとした時、整数は問題なし、小数はエラーとなる
select cast('2' as smallint);               -- 結果: 2
select cast('2.4' as smallint);             -- 結果: エラー

-- 3.範囲外の数を登録しようとした時、エラーとなる
select cast(-32769 as smallint);            -- 結果: エラー
select cast(32768 as smallint);             -- 結果: エラー

-- 4.数式で登録しようとした時、特に問題なし
select cast(2 + 3 as smallint);             -- 結果: 5
select cast(2 + 3.5 as smallint);           -- 結果: 6


-- 動作確認(bigint)
-- 1.小数を登録しようとした時、小数点以下は四捨五入される
select cast(2.4 as bigint);               -- 結果: 2
select cast(2.5 as bigint);               -- 結果: 3

-- 2.文字列の整数を登録しようとした時、整数は問題なし、小数はエラーとなる
select cast('2' as bigint);               -- 結果: 2
select cast('2.4' as bigint);             -- 結果: エラー

-- 3.範囲外の数を登録しようとした時、エラーとなる
select cast(-9223372036854775809 as bigint); -- 結果: エラー
select cast(9223372036854775808 as bigint);  -- 結果: エラー

-- 4.数式で登録しようとした時、特に問題なし
select cast(2 + 3 as bigint);             -- 結果: 5
select cast(2 + 3.5 as bigint);           -- 結果: 6

 

 

numeric型、decimal型

numeric、decimalとは

numericとdecimalは小数も可能な数値型です。

PostgreSQL文書を参照すると、「decimalとnumeric型は等価です。」とあるように、

全く意味が同じものです。なのでどちらを使っても同じです。

※ 心配性な方は「decimal numeric 違い」と調べてみてもわかると思います。

 

また+とーの値をとり、表現できる桁数は、

「小数点より上は131072桁まで、小数点より下は16383桁まで」と事実上、無限です。

超えるように検証するのはここでは諦めます。

 

また、numericはかっこ()をつける書き方と、かっこをつけない書き方があります。

かっこをつけると整数、小数点の桁数が指定でき、かっこをつけなければ最大まで格納できます。

-- numeric(X,Y)は全体でX桁で表示するうち、小数点はY桁となる
select cast(12.345 as numeric(3,1));       -- 結果: 12.3
select cast(1.2345 as numeric(3,2));       -- 結果: 1.23
-- 動作確認(numeric)
-- select文のため、そのままコピーしすぐ実行できるようになっています

-- 1.小数を登録しようとした時、小数点以下は四捨五入される
select cast(2.4 as numeric);               -- 結果: 2.4
select cast(2.5 as numeric);               -- 結果: 2.5

-- 2.文字列の整数を登録しようとした時、特に問題なし
select cast('2' as numeric);               -- 結果: 2
select cast('2.4' as numeric);             -- 結果: 2.4

-- 3.範囲外の数を登録しようとした時、特に問題なし
select cast(-32769 as numeric);            -- 結果: -32769
select cast(32768 as numeric);             -- 結果: 32768

-- 4.数式で登録しようとした時、特に問題なし
select cast(2 + 3 as numeric);             -- 結果: 5
select cast(2 + 3.5 as numeric);           -- 結果: 5.5