今日はPostgreSQLの数値データ型について話すよ。もし「42」みたいな数字や、ファイナンスの計算、あるいはミリ秒を保存したいと考えたことがあるなら、ここがピッタリ。どの型がどんな場面に合うのか、一緒に見ていこう。君と君のデータが快適に過ごせるようにね。
PostgreSQLの数値データ型は大きく3つのグループに分かれてる:
- 整数 (
INTEGER): 小数点以下がない数字を保存するための型。1、42、-7みたいな馴染みのある数字だね。 - 正確な数値 (
NUMERIC): 小数点以下の桁数が決まってる数字を保存するための型。ファイナンス計算とか、精度が命なときに便利。 - 浮動小数点数 (
REAL): めっちゃ大きい数字や、すごく小さい数字を保存したいときに使う。NUMERICより精度は落ちるけど、サイエンス系の計算には十分!
INTEGER型
INTEGERは整数用のデータ型。小数点以下がいらない数字を保存したいときにピッタリ。PostgreSQLには3種類のINTEGERがあって、いろんな範囲をカバーできる:
SMALLINT: 小さい整数用。範囲:-32,768〜32,767。INTEGER(またはINT): 標準的な整数型。範囲:-2,147,483,648〜2,147,483,647。BIGINT: でっかい数字用。範囲:-9,223,372,036,854,775,808〜9,223,372,036,854,775,807。
例えば、studentsというテーブルがあって、学生の名前・年齢・取得クレジット数(単位数)を保存してるとしよう:
| id | name | age | credits |
|---|---|---|---|
| 1 | Otto Nate | 21 | 30 |
| 2 | Maria Chi | 22 | 45 |
| 3 | Peter Val | 20 | 60 |
| 4 | Anna Song | 23 | 50 |
| 5 | Sophie Zhang | 21 | 35 |
じゃあ、SQLで学生の名前・年齢・クレジット数を一覧で出してみよう:
SELECT name, age, credits
FROM students;
結果:
| name | age | credits |
|---|---|---|
| Otto Nate | 21 | 30 |
| Maria Chi | 22 | 45 |
| Peter Val | 20 | 60 |
| Anna Song | 23 | 50 |
| Sophie Zhang | 21 | 35 |
INTEGERを使うタイミングは?
- 識別子(
idや注文番号など)を保存したいとき。 - 何かの個数(在庫数や学生数など)を保存したいとき。
NUMERIC型
NUMERICは小数点以下の桁数が決まってる正確な数字用のデータ型。たとえば123.456みたいな数字で、小数点以下1桁でもズレたら信用(やお金)が吹っ飛ぶようなときは、絶対NUMERICを使おう。
宣言フォーマット:NUMERIC(precision, scale)。ここで:
precision— 全体の桁数(小数点の前も後も含む)。scale— 小数点以下の桁数。
例えば、NUMERIC(6, 2)なら最大6桁で、そのうち2桁が小数点以下になる。
じゃあ、ファイナンスのトランザクションを記録するテーブルを作ってみよう:
| id | description | amount |
|---|---|---|
| 1 | 学費の支払い | 2345.67 |
| 2 | 毎月の奨学金 | 500.00 |
| 3 | ラボ利用料 | 145.99 |
| 4 | 図書館の罰金 | 12.75 |
| 5 | カンファレンス登録 | 320.50 |
じゃあ、トランザクション一覧を出してみよう:
SELECT description, amount
FROM transactions;
結果:
| description | amount |
|---|---|
| 学費の支払い | 2345.67 |
| 毎月の奨学金 | 500.00 |
| ラボ利用料 | 145.99 |
| 図書館の罰金 | 12.75 |
| カンファレンス登録 | 320.50 |
NUMERICを使うタイミングは?
- ファイナンス計算(商品の値段や給料など)。
- 正確な計測値(重さや長さなど)を保存したいとき。
measurementsテーブル
| id | mass - REAL | height - REAL |
|---|---|---|
| 1 | 70.5 | 1.83 |
| 2 | 64.2 | 1.75 |
| 3 | 82.3 | 1.92 |
| 4 | 55.0 | 1.60 |
じゃあ、値を出してみよう:
SELECT mass, height
FROM measurements;
結果:
| mass | height |
|---|---|
| 70.5 | 1.83 |
| 64.2 | 1.75 |
| 82.3 | 1.92 |
| 55.0 | 1.60 |
REALを使うタイミングは?
- サイエンス系の計算(原子の質量や月までの距離など)。
- 多少の誤差が許されるデータのモデリング。
数値型の比較:どれをいつ使う?
| データ型 | 範囲 | 精度 | 使いどころ例 |
|---|---|---|---|
SMALLINT |
-32,768〜32,767 | 整数 | 小さい数字(年齢、レーティングなど)。 |
INTEGER |
-2,147,483,648〜2,147,483,647 | 整数 | 識別子、個数など。 |
BIGINT |
-9,223,372,036,854,775,808〜9,223,372,036,854,775,807 | 整数 | めっちゃ大きい数字。 |
NUMERIC |
precisionとscaleによる |
正確な小数 | ファイナンス、計測値。 |
REAL |
約6桁の小数 | 浮動小数点 | ざっくりしたデータやサイエンス系。 |
DOUBLE PRECISION |
約15桁の小数 | 高精度な浮動小数点 | サイエンス、リサーチ。 |
エイリアス
PostgreSQLの数値型にはたくさんエイリアス(別名)があるよ。これは型の別名で、動作は同じだけど読みやすさや他のDBとの互換性が良くなる。
PostgreSQLの数値型エイリアスをざっくりまとめると:
整数型のエイリアス
| エイリアス | 本当の型 | サイズ | 範囲 |
|---|---|---|---|
INT |
INTEGER |
4バイト | −2,147,483,648〜2,147,483,647 |
INT4 |
INTEGER |
4バイト | (古いエイリアス) |
SMALLINT |
SMALLINT |
2バイト | −32,768〜32,767 |
INT2 |
SMALLINT |
2バイト | |
BIGINT |
BIGINT |
8バイト | −9クインティリオン〜+9クインティリオン |
INT8 |
BIGINT |
8バイト |
正確な数値のエイリアス
| エイリアス | 本当の型 | 用途 |
|---|---|---|
DEC |
NUMERIC |
SQL標準のシノニム |
DECIMAL |
NUMERIC |
同じく |
浮動小数点数のエイリアス
| エイリアス | 本当の型 | 精度 |
|---|---|---|
FLOAT |
DOUBLE PRECISION |
~15桁(デフォルト) |
FLOAT(24) |
REAL |
~6桁 |
FLOAT(53) |
DOUBLE PRECISION |
~15桁 |
FLOAT8 |
DOUBLE PRECISION |
古いエイリアス |
FLOAT4 |
REAL |
古いエイリアス |
よくあるミス
数値型を使うとき、いくつかの落とし穴があるよ:
データ型の選択ミス。 例えば年齢をSMALLINTで保存したら、マトリックスのロボットみたいに何百万年も生きてるやつには足りないかも。
丸めによるデータ損失。 ファイナンス計算でREALを使うと、1円単位でズレることも。信頼も失うかもね。
異なる型の比較。 INTEGERとREALを比較すると、浮動小数点の仕様で思わぬ結果になることがある。
GO TO FULL VERSION