正確選擇數據類型是資料庫設計的基石,影響存儲空間、查詢性能、數據完整性。本文按類別整理 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 |
BIGINT | 8 | -2^63 ~ 2^63-1 | 0 ~ 2^64-1 |
選型原則:INT 為通用首選;狀態碼、枚舉值用 TINYINT;大量主鍵自增用 BIGINT;明確非負加 UNSIGNED 翻倍範圍。
| 類型 | 字節 | 精度特點 |
|---|---|---|
FLOAT | 4 | 單精度,約 7 位有效數字,有誤差 |
DOUBLE | 8 | 雙精度,約 15 位有效數字,誤差較小 |
DECIMAL(M,D) | M+2 | 精確定點數,M 總位數,D 小數位,金融必用 |
選型原則:涉及金額、精確計算務必用 DECIMAL;科學計算、近似值可用 DOUBLE;FLOAT 僅用於極不敏感的輕量場景。
| 類型 | 字節 | 範圍 | 特點 |
|---|---|---|---|
DATE | 4 | 1000-01-01 ~ 9999-12-31 | 僅日期 |
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 | 自動轉換時區,範圍較小 |
TIME | 3 | -838:59:59 ~ 838:59:59 | 僅時間 |
YEAR | 1 | 1901 ~ 2155 | 僅年份 |
選型原則:需時區感知用 TIMESTAMP(如創建/更新時間戳);歷史/未來寬範圍用 DATETIME;僅需日期/時間/年份分別用 DATE/TIME/YEAR 節省空間。
| 類型 | 最大長度 | 存儲特點 |
|---|---|---|
CHAR(M) | 255 字符 | 固定長度,不足右填空格,適合定長代碼(如 MD5、ISO 代碼) |
VARCHAR(M) | 65,535 字符 | 變長,實際長度+1/2 字節存長度,通用首選 |
TINYTEXT | 255 字節 | 不指定長度,存儲開銷 +2 字節 |
TEXT | 65,535 字節 | 長文本,不可有 DEFAULT 值 |
MEDIUMTEXT | 16,777,215 字節 | 中等長文本 |
LONGTEXT | 4,294,967,295 字節 | 超長文本 |
核心差異:CHAR(5) 存 'abc' 佔 5 字節;VARCHAR(5) 存 'abc' 佔 3+1=4 字節。頻繁 UPDATE 定長列用 CHAR 減少碎片,其餘用 VARCHAR。
BINARY(M)(定長)、VARBINARY(M)(變長)存儲字節流(圖片、加密數據、文件流),與 CHAR/VARCHAR 關係同理。BLOB 系列(TINYBLOB~LONGBLOB)對應 TEXT 系列,存儲大二進制對象。
| 類型 | 成員上限 | 單行可選數量 | 典型場景 |
|---|---|---|---|
ENUM('a','b',...) | 65,535 | 1 | 性別、狀態、類型等單選 |
SET('a','b',...) | 64 | 多個(位掩碼存儲) | 標籤、權限、多選屬性 |
注意:ENUM/SET 成員順序即排序順序,修改成員需 ALTER TABLE 重建表,慎用於頻繁變動的業務字典。