選擇合適的數據類型是 Schema 設計的基石,影響存儲空間、查詢性能、數據完整性。本文系統梳理 MySQL 所有內建類型。
| 類型 | 字節 | 有符號範圍 | 無符號範圍 | 用途 |
|---|---|---|---|---|
| TINYINT | 1 | -128~127 | 0~255 | 極小整數、布爾標誌 |
| SMALLINT | 2 | -32768~32767 | 0~65535 | 小整數 |
| MEDIUMINT | 3 | -8388608~8388607 | 0~16777215 | 中等整數 |
| INT/INTEGER | 4 | -2147483648~2147483647 | 0~4294967295 | 標準整數、主鍵 |
| BIGINT | 8 | -9.22E18~9.22E18 | 0~1.84E19 | 極大整數、雪花ID |
顯示寬度:INT(4) 僅影響 ZEROFILL 時的左填充,**不限制存儲範圍**。
UNSIGNED:無符號,擴大正數範圍,節省 1 bit 符號位。
ZEROFILL:自動加 UNSIGNED,不足寬度左補 0。
| 類型 | 字節 | 精度 | 範圍 | 用途 |
|---|---|---|---|---|
| FLOAT(M,D) | 4 | 單精度(~7位有效數字) | ±3.4E38 | 科學計算、近似值 |
| DOUBLE(M,D) | 8 | 雙精度(~15位) | ±1.7E308 | 高精度科學計算 |
| DECIMAL(M,D) | M+2 | 精確十進制(字符串存儲) | 取決於 M,D | 財務金額、精確計算 |
DECIMAL(10,2) 存 99999999.99,超出四捨五入報錯(非截斷)。
| 類型 | 最大長度 | 特點 | 用途 |
|---|---|---|---|
| CHAR(N) | 255 字符 | 定長,右補空格 | 固定長度代碼、MD5、UUID |
| VARCHAR(N) | 65535 字符(共享 64KB 行上限) | 變長,1-2 字節存長度 | 通用字符串 |
| TINYTEXT | 255 字節 | 無排序、無默認值 | 短文本 |
| TEXT | 64KB | 同上 | 長文本 |
| MEDIUMTEXT | 16MB | 同上 | 中等長文本 |
| LONGTEXT | 4GB | 同上 | 極大文本 |
| BLOB 系列 | 對應 TEXT 大小 | 二進制,區分大小寫 | 圖片、文件、序列化數據 |
CHAR vs VARCHAR:頻繁更新定長列用 CHAR 避免碎片;不定長用 VARCHAR 節省空間。
| 類型 | 字節 | 範圍 | 格式 | 用途 |
|---|---|---|---|---|
| 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 UTC ~ 2038-01-19 | YYYYMMDDHHMMSS | 自動更新、跨時區 |
TIMESTAMP:插入 NULL/不指定 → 自動填充當前時間;受 time_zone 影響。**2038 年問題**需關注,長期項目優先 DATETIME 或 BIGINT 存毫秒數。
錯誤值查詢:WHERE enum_col = '' OR enum_col = 0。