CodeGym /課程 /SQL SELF /數值型別: INTEGER、 NUMERIC、 FLOAT

數值型別: INTEGER、 NUMERIC、 FLOAT

SQL SELF
等級 15, 課堂 1
開放

今天我們來聊聊 PostgreSQL 裡的數值型別。如果你有想過怎麼存「42」這種數字、財務計算,或是毫秒這種東西——你來對地方啦。來搞懂一下每種型別適合什麼場景,讓你跟你的資料都能爽爽的。

PostgreSQL 裡的數值型別大致分成三大類:

  1. 整數(INTEGER):用來存沒有小數點的數字。像是 1、42、-7 這種很直觀的數。
  2. 精確數字(NUMERIC):用來存有固定小數位數的數字。超適合財務計算,精確度比命還重要的那種。
  3. 浮點數(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 來比,因為浮點數的特性,結果可能會很奇怪。

2
任務
SQL SELF, 等級 15, 課堂 1
上鎖
四捨五入溫度
四捨五入溫度
2
任務
SQL SELF, 等級 15, 課堂 1
上鎖
單位轉換(公里/小時 → 公尺/秒)
單位轉換(公里/小時 → 公尺/秒)
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION