選對資料類型是效能與儲存空間優化的基石。本文整理 MySQL 所有內建類型的儲存範圍、位元組數、適用場景與避坑提醒,作為建表時的桌邊參考卡。
| 類型 | 位元組 | 有號範圍 | 無號範圍 | 適用場景 |
|---|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 布林旗標、極小計數、枚舉替代 |
| SMALLINT | 2 | -32,768 ~ 32,767 | 0 ~ 65,535 | 小範圍計數、狀態碼 |
| MEDIUMINT | 3 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 中等計數、節省空間 |
| INT / INTEGER | 4 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 通用 ID、計數器、IPv4 (UNSIGNED) |
| BIGINT | 8 | -9.22e18 ~ 9.22e18 | 0 ~ 1.84e19 | 巨大 ID、高精度時間戳、雪花算法 ID |
提示:INT(4) 的 4 僅為顯示寬度,不影響儲存範圍;非負業務務必加 UNSIGNED。
| 類型 | 位元組 | 精度 | 說明 |
|---|---|---|---|
| FLOAT | 4 | ~7 位有效數字 | 單精度,科學計算、座標 |
| DOUBLE | 8 | ~15 位有效數字 | 雙精度,預設浮點類型 |
避坑:貨幣、精確計算禁用 FLOAT/DOUBLE,改用 DECIMAL。
| 類型 | 位元組 | 範圍 | 特性 |
|---|---|---|---|
| YEAR | 1 | 1901 ~ 2155 | 僅年份 |
| DATE | 3 | 1000-01-01 ~ 9999-12-31 | 日期 |
| TIME | 3 | -838:59:59 ~ 838:59:59 | 時間 |
| DATETIME | 8 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 無時區,靜態時間點 |
| TIMESTAMP | 4 | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC | 含時區自動轉換、預設 CURRENT_TIMESTAMP、ON UPDATE 自動刷新 |
選擇建議:優先 TIMESTAMP(4 Bytes、自動維護),跨時區應用必選;歷史/未來超出 2038 年用 DATETIME。
| 類型 | 最大長度 | 儲存特性 | 適用場景 |
|---|---|---|---|
| CHAR(N) | 255 字元 | 定長,右側補空格 | 固定長度代碼(MD5、UUID、國籍代碼) |
| VARCHAR(N) | 65,535 字元 (共享 64KB) | 變長,1-2 Bytes 長度前綴 | 通用變長字串 |
| TINYTEXT | 255 Bytes | Blob 族,離頁儲存 | 極短文本 |
| TEXT | 64 KB | 一般文本 | |
| MEDIUMTEXT | 16 MB | 長文本 | |
| LONGTEXT | 4 GB | 超長文本 | |
| ENUM | 65,535 個元素 | 內部存數字 ID | 固定集合(狀態、類型),建議改 TINYINT |
| SET | 64 個元素 | 位圖存儲 | 多選集合,建議改 TINYINT 位運算 |
M:總有效位數(精度),最大 65(MySQL 5.0+)D:小數位數(刻度),0 ≤ D ≤ M,預設 0DECIMAL(19,4) 滿足大多數幣制)TINYINT(1),1 ByteTRUE (1)、FALSE (0)TINYINT UNSIGNED 或 BIT(1),語義更明確TINYINT/SMALLINT/MEDIUMINT/INT/BIGINT + UNSIGNEDDECIMAL(M,D)DOUBLE(預設)TIMESTAMP 優先,超出範圍用 DATETIMECHAR、變長 VARCHAR、大文本 TEXT 族、二進位 BLOB 族TINYINT + 應用層常數定義牢記「剛好夠用、優先定長、非負加 UNSIGNED、金額用 DECIMAL」,即可在建表時做出最優類型決策。