在設計資料庫結構時,選擇正確的數據類型對於效能、儲存空間與資料完整性至關重要。MySQL 提供了豐富的數據類型,大致可分為數值類型、字串類型、日期時間類型與複合類型。本文將系統性地整理各類型的特性、適用場景與常見誤區,助你做出最佳選擇。
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 |
| BIGINT | 8 字節 | -9.22×10¹⁸ ~ 9.22×10¹⁸ | 0 ~ 1.84×10¹⁹ | 極大整數(如唯一標識符) |
關鍵細節:
INT(m) 中的 m 僅影響查詢結果的顯示寬度(搭配 ZEROFILL 時填充 0),不限制實際儲存範圍。UNSIGNED 可將最大值翻倍,適用於不需負數的場景(如自增 ID)。ZEROFILL 會隱含添加 UNSIGNED,查詢時以 0 填充至指定寬度。| 類型 | 大小 | 精度 | 語法 | 特性 |
|---|---|---|---|---|
| FLOAT | 4 字節 | 單精度(約 7 位有效數字) | FLOAT(m,d) | 近似值,適合科學計算 |
| DOUBLE | 8 字節 | 雙精度(約 15 位有效數字) | DOUBLE(m,d) | 近似值,精度更高 |
| DECIMAL | 視 M、D 而定 | 精確值 | DECIMAL(m,d) M<65, D<30 | 精確儲存,適合金融、價格 |
避坑指南: FLOAT(5,3) 插入 123.45678 會四捨五入為 123.457,但實際儲存位數仍以實際值為準。涉及金額、精確計算務必使用 DECIMAL。
| 特性 | CHAR(n) | VARCHAR(n) |
|---|---|---|
| 長度 | 固定長度,0-255 字符 | 變長,0-65,535 字符 |
| 儲存方式 | 不足補空格,查詢時去除尾部空格 | 實際長度 + 1/2 字節長度前綴 |
| 效能 | 查詢速度較快(固定長度易定位) | 節省空間,適合不定長字符 |
| 尾部空格 | 不保留 | 保留 |
選擇建議: 長度固定(如 MD5、UUID、郵編)用 CHAR;長度不一(如姓名、地址)用 VARCHAR。
| 類型 | 最大長度 | 用途 |
|---|---|---|
| TINYTEXT / TINYBLOB | 255 字節 | 極短文本/二進制 |
| TEXT / BLOB | 65,535 字節 | 常規長文本/二進制 |
| MEDIUMTEXT / MEDIUMBLOB | 16,777,215 字節 | 中等長度 |
| LONGTEXT / LONGBLOB | 4,294,967,295 字節 | 極大文本/二進制 |
核心差異:
| 類型 | 大小 | 範圍 | 格式 | 適用場景 |
|---|---|---|---|---|
| DATE | 3 字節 | 1000-01-01 ~ 9999-12-31 | YYYY-MM-DD | 純日期(生日、入職日) |
| TIME | 3 字節 | -838:59:59 ~ 838:59:59 | HH:MM:SS | 時間段或一天內時間 |
| YEAR | 1 字節 | 1901 ~ 2155 | YYYY | 年份 |
| DATETIME | 8 字節 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 日期時間混合,無時區感知 |
| TIMESTAMP | 4 字節 | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 | YYYYMMDDHHMMSS | 自動記錄修改時間,帶時區轉換 |
TIMESTAMP 獨特行為: 若未顯式賦值或賦 NULL,自動填充當前時間;記錄更新時亦自動刷新。適合「最後修改時間」欄位。注意 2038 年上限問題,長期項目建議用 DATETIME。
| 關鍵字 | 含義 |
|---|---|
| NULL / NOT NULL | 是否允許空值 |
| DEFAULT | 預設值 |
| PRIMARY KEY | 主鍵 |
| AUTO_INCREMENT | 自增(整數類型) |
| UNSIGNED | 無符號,擴大正數範圍 |
| CHARACTER SET | 指定字符集 |
| BINARY | 二進制比較(區分大小寫) |