數值類型
| 類型 | 存儲 | 有符號範圍 | 無符號範圍 | 用途建議 |
| TINYINT | 1B | -128 ~ 127 | 0 ~ 255 | 布爾標誌、極小計數、枚舉值 |
| SMALLINT | 2B | -32,768 ~ 32,767 | 0 ~ 65,535 | 小範圍計數、年齡、狀態碼 |
| MEDIUMINT | 3B | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 中等計數、RGB 顏色值 |
| INT / INTEGER | 4B | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | 主鍵、外鍵、通用計數(首選) |
| BIGINT | 8B | -9.22e18 ~ 9.22e18 | 0 ~ 1.84e19 | 海量主鍵、時間戳毫秒、大文件字節數 |
| FLOAT(M,D) | 4B | ±3.4028E38 ~ ±1.1755E-38 | — | 單精度科學計算、不精確金額慎用 |
| DOUBLE(M,D) / REAL | 8B | ±1.7977E308 ~ ±2.2251E-308 | — | 雙精度科學計算、GIS 坐標 |
| DECIMAL(M,D) / NUMERIC | M+2B | 精確定點,M≤65, D≤30 | — | 金額、價格、比率、任何需精確計算 |
| BIT(M) | ~M/8 B | 位域 1~64 位 | — | 位掩碼、權限位圖 |
日期時間類型
| 類型 | 存儲 | 範圍 | 精度 | 時區感知 | 用途 |
| DATE | 3B | 1000-01-01 ~ 9999-12-31 | 天 | 否 | 生日、紀念日、純日期業務 |
| TIME | 3B | -838:59:59 ~ 838:59:59 | 秒 | 否 | 時長、每日重複時間點 |
| DATETIME | 8B | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 秒 | 否 | 歷史記錄、不需時區轉換的時間點 |
| TIMESTAMP | 4B | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC | 秒 | 是 (會話時區轉換) | 創建/更新時間、跨時區應用 |
| YEAR[(2|4)] | 1B | 1901~2155 (4位) / 70~69 (2位, 1970~2069) | 年 | 否 | 年份篩選、歸檔分區 |
關鍵差異:TIMESTAMP 存儲 UTC,讀取時按 time_zone 轉換;DATETIME 存儲本地時間,不轉換。5.6.4+ 支持 DATETIME(6)/TIMESTAMP(6) 微秒精度。
字符串類型
| 類型 | 最大長度 | 存儲開銷 | 特性 | 用途 |
| CHAR(M) | 255 字符 | M 字符 (定長,右補空格) | 讀取去尾空格,定長快 | 固定長度代碼:MD5、UUID、國標碼 |
| VARCHAR(M) | 65,535 字符 (行限制) | L+1/2 字節 (實際長度+長度前綴) | 變長,不補空格 | 通用字符串、名稱、標題、JSON 片段 |
| TINYTEXT / TINYBLOB | 255 (2^8-1) | L+1 | 不指定字符集/二進制 | 極短文本/二進制 |
| TEXT / BLOB | 65,535 (2^16-1) | L+2 | — | 文章正文、日志、中等二進制 |
| MEDIUMTEXT / MEDIUMBLOB | 16,777,215 (2^24-1) | L+3 | — | 長文檔、圖片、文檔 |
| LONGTEXT / LONGBLOB | 4,294,967,295 (2^32-1) | L+4 | — | 超大對象、視頻、備份文件 |
| ENUM('v1','v2',...) | 65,535 個值 | 1-2 字節 | 內部存數字索引,嚴格枚舉 | 狀態機、固定分類、性別、優先級 |
| SET('v1','v2',...) | 64 個成員 | 1-8 字節 | 位掩碼,可多選 | 標籤、權限集合、多屬性 |
行長度限制:MySQL 單行最大 65,535 字節(除 BLOB/TEXT 溢出頁)。VARCHAR(65535) 實際不可達,因長度前綴佔 2 字節、NULL 位圖、其他列開銷。
空間數據類型 (MySQL 4.1+ / 5.7+ 增強)
| 類型 | 說明 | 索引支持 |
| GEOMETRY | 所有幾何類型基類 | SPATIAL (MyISAM/Aria/InnoDB 5.7+) |
| POINT | 單點 (X,Y) | ✓ |
| LINESTRING | 線串 (多點連線) | ✓ |
| POLYGON | 多邊形 (外環+內環) | ✓ |
| MULTIPOINT / MULTILINESTRING / MULTIPOLYGON | 集合類型 | ✓ |
| GEOMETRYCOLLECTION | 混合集合 | ✓ |
JSON 類型 (5.7+)
- 存儲:二進制格式,解析快、支持部分更新。
- 索引:不能直接索引,需通過虛擬列
INDEX idx_json_name ((json_col->>'$.name'))。
- 函數:
JSON_EXTRACT、->、->>、JSON_SET、JSON_ARRAYAGG 等。
選型決策樹
- 整數主鍵 →
BIGINT UNSIGNED AUTO_INCREMENT (單表 >42 億) 或 INT UNSIGNED (足夠則用)。
- 金額/價格/匯率 →
DECIMAL(19,4) 或 DECIMAL(12,2),絕不 FLOAT/DOUBLE。
- 時間點且跨時區 →
TIMESTAMP;歷史/生日/不轉換 → DATETIME。
- 微秒精度 →
DATETIME(6)/TIMESTAMP(6) (5.6.4+)。
- 短定長代碼 →
CHAR(32) (MD5) / CHAR(36) (UUID);其餘字符串 → VARCHAR。
- 超大文本/二進制 →
LONGTEXT/LONGBLOB,考慮對象存儲 (S3/MinIO) 只存 URL。
- 固定枚舉 →
ENUM;多選標籤 → SET 或關聯表 (規範化)。
總結
「用最小足夠的類型」是 schema 設計鐵律:節省存儲 → 更多熱數據進內存 → 少 I/O → 快查詢。建表前先問:業務上限多大?需不需要精確計算?跨時區嗎?會不會全文搜索? 對號入座,拒絕「一律 VARCHAR(255) / BIGINT / DATETIME」的懶惰設計。