【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