今天我們來聊聊 PostgreSQL 裡的數值型別。如果你有想過怎麼存「42」這種數字、財務計算,或是毫秒這種東西——你來對地方啦。來搞懂一下每種型別適合什麼場景,讓你跟你的資料都能爽爽的。
PostgreSQL 裡的數值型別大致分成三大類:
- 整數(
INTEGER):用來存沒有小數點的數字。像是 1、42、-7 這種很直觀的數。 - 精確數字(
NUMERIC):用來存有固定小數位數的數字。超適合財務計算,精確度比命還重要的那種。 - 浮點數(
REAL):用來存可以超大或超小的數字。精確度沒NUMERIC那麼高,但很適合科學計算。
型別 INTEGER
INTEGER 就是整數型別啦。適合存沒有小數點的數字。PostgreSQL 給你三種 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(
id)、訂單號這種識別碼。 - 存數量(像是庫存數、學生人數)。
型別 NUMERIC
NUMERIC 是用來存精確小數的型別。如果你要存像 123.456 這種數字,而且小數點後一位錯了就會出事(或賠錢),那就用 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 位小數 | 高精度浮點數 | 科學、研究。 |
別名(Aliasing)
在 PostgreSQL 裡,很多數值型別都有別名(alias)——就是型別的另一種叫法,功能一樣,但有時候看起來比較順眼,或是跟其他資料庫相容。
這裡有個數值型別別名的快速指南:
整數型別的別名
| 別名 | 實際型別 | 大小 | 範圍 |
|---|---|---|---|
INT |
INTEGER |
4 bytes | −2,147,483,648 到 2,147,483,647 |
INT4 |
INTEGER |
4 bytes | (舊別名) |
SMALLINT |
SMALLINT |
2 bytes | −32,768 到 32,767 |
INT2 |
SMALLINT |
2 bytes | |
BIGINT |
BIGINT |
8 bytes | −9 quintillion 到 +9 quintillion |
INT8 |
BIGINT |
8 bytes |
精確數字的別名
| 別名 | 實際型別 | 用途 |
|---|---|---|
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 來做財務計算,會不見零頭,最後連客戶信任都沒了。
不同型別比較。 如果你拿 INTEGER 跟 REAL 來比,因為浮點數的特性,結果可能會很奇怪。
GO TO FULL VERSION