選對類型 = 省空間 + 快查詢。本文按存儲容量從小到大梳理 MySQL 核心類型,附帶範圍、存儲字節、選型建議。
| 類型 | 存儲 | 有符號範圍 | 無符號範圍 | 典型場景 |
|---|---|---|---|---|
| TINYINT | 1 字節 | -128 ~ 127 | 0 ~ 255 | 布爾、狀態、枚舉(0/1/2) |
| SMALLINT | 2 字節 | -32,768 ~ 32,767 | 0 ~ 65,535 | 小範圍計數、年齡 |
| MEDIUMINT | 3 字節 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 中等計數、顏色 RGB |
| INT / INTEGER | 4 字節 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | **主鍵自增首選**、通用計數 |
| BIGINT | 8 字節 | -9.22e18 ~ 9.22e18 | 0 ~ 1.84e19 | 巨大 ID、時間戳毫秒、流水號 |
提示:UNSIGNED 可將正數範圍翻倍,不改變存儲大小。ZEROFILL 自動補零顯示。AUTO_INCREMENT 僅允許一列,需配合主鍵/唯一鍵。
| 類型 | 存儲 | 精度 | 範圍 | 適用場景 |
|---|---|---|---|---|
| FLOAT(M,D) | 4 字節 | ~7 位有效數字 | ±1.17E-38 ~ ±3.40E+38 | 科學計算、不需精確金額 |
| DOUBLE(M,D) | 8 字節 | ~15 位有效數字 | ±2.22E-308 ~ ±1.79E+308 | 高精度科學計算 |
| DECIMAL(M,D) | M+2 字節 | 精確到 D 位小數 | 取決於 M,D | **金額、價格、比率** 必用 |
M=總位數,D=小數位數。DECIMAL 內部以字符串存儲,計算精確但較慢。
| 類型 | 存儲 | 範圍 | 零值 | 備註 |
|---|---|---|---|---|
| YEAR | 1 字節 | 1901 ~ 2155 | 0000 | 僅存年份 |
| DATE | 3 字節 | 1000-01-01 ~ 9999-12-31 | 0000-00-00 | 最常用日期類型 |
| TIME | 3 字節 | -838:59:59 ~ 838:59:59 | 00:00:00 | 可存時長(超過 24h) |
| DATETIME | 8 字節 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 0000-00-00 00:00:00 | 無時區,應用層處理時區 |
| TIMESTAMP | 4 字節 | 1970-01-01 08:00:01 ~ 2038-01-19 11:14:07 (UTC) | 0000-00-00 00:00:00 | **帶時區**,寫入 NULL 自動設為當前時間 |
選型建議:DATETIME 範圍大、無時區轉換,適合業務時間;TIMESTAMP 自動維護創建/更新時間,但 2038 年問題需注意。
| 類型 | 最大長度 | 存儲開銷 | 特點 |
|---|---|---|---|
| CHAR(M) | 255 字節 | M 字節(定長,右補空格) | 極短固定長(如 MD5、ISO 代碼) |
| VARCHAR(M) | 65,535 字節 | L+1/2 字節(可變長) | **最常用**,動態長度文本 |
| TINYTEXT | 255 字節 | L+1 字節 | 無默認值,不建議用 |
| TEXT | 64 KB | L+2 字節 | 較長文本 |
| MEDIUMTEXT | 16 MB | L+3 字節 | 長文本 |
| LONGTEXT | 4 GB | L+4 字節 | 超長文本 |
| ENUM | 65,535 個成員 | 1-2 字節 | 單選枚舉(如狀態:'pending','done') |
| SET | 64 個成員 | 1-8 字節 | 多選集合(如標籤:'tag1','tag2') |
注意:TEXT/BLOB 類型無法加默認值、無法建全長索引(需指定前綴長度)、臨時表落盤較慢,能用 VARCHAR 盡量不用。
BIGINT/UNSIGNED AUTO_INCREMENT。