數值類型
整數類型
| 類型 | 存儲 | 有符號範圍 | 無符號範圍 |
| 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 |
| INT | 4B | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 |
| BIGINT | 8B | -9.22E18 ~ 9.22E18 | 0 ~ 1.84E19 |
顯示寬度 M:INT(5) 僅影響顯示格式(配合 ZEROFILL),不限制存儲範圍與空間。
浮點與定點類型
| 類型 | 存儲 | 精度說明 |
| FLOAT | 4B | 單精度,約 7 位有效數字 |
| DOUBLE | 8B | 雙精度,約 15 位有效數字 |
| DECIMAL(M,D) | M+2B | 精確定點數,字符串存儲,無圖誤差,適合財務 |
選型原則:整數優先用最小滿足範圍的類型;財務金額必用 DECIMAL;科學計算用 DOUBLE。
數值列屬性
UNSIGNED:禁止負數,擴大正數範圍。
ZEROFILL:左側補 0 至顯示寬度,隱含 UNSIGNED。
AUTO_INCREMENT:自增序列,僅整數列。
NULL / NOT NULL、DEFAULT。
字符串類型
定長與變長
| 類型 | 最大長度 | 存儲 | 特點 |
| CHAR(M) | M 字符 | M 字符 | 固定長度,右側空格填充 |
| VARCHAR(M) | M 字符 | L+1/2 字節 | 變長,L 為實際長度 |
選擇建議:長度固定或近似用 CHAR(MyISAM 效率高);長度差異大用 VARCHAR 節省空間。表中任一列變長 → 全表行變長(CHAR<4 除外)。
大對象類型
| 類型 | 最大長度 | 存儲 | 二進制/文本 |
| TINYBLOB/TEXT | 255 B | L+1 | 二進制/非二進制 |
| BLOB/TEXT | 64 KB | L+2 | 二進制/非二進制 |
| MEDIUMBLOB/TEXT | 16 MB | L+3 | 二進制/非二進制 |
| LONGBLOB/TEXT | 4 GB | L+4 | 二進制/非二進制 |
索引支持:MyISAM 5.0+、InnoDB 5.5+ 支持 BLOB/TEXT 前綴索引。定期 OPTIMIZE TABLE 減少碎片。
ENUM 與 SET
- ENUM:單選,最多 65,535 個成員,內部按聲明順序編碼 1~n。
- SET:多選,最多 64 個成員,內部位掩碼存儲(第 0 位對應首個值)。
- 非法值插入 → 空字符串(ENUM)或忽略非法項(SET)。
字符集與校對規則
- MySQL 4.1+ 支持列級字符集,按 列→表→庫→服務器 級聯查找。
- 二進制字符串(BLOB、BINARY 屬性 CHAR/VARCHAR)按字節值比較,區分大小寫。
- 非二進制字符串按字符集校對規則比較,通常不區分大小寫。
VARCHAR(20) 限制字節數而非字符數,多字節字符集實際字符數更少。
日期時間類型
| 類型 | 範圍 | 存儲 | 零值 | 格式 |
| DATE | 1000-01-01 ~ 9999-12-31 | 3B | 0000-00-00 | YYYY-MM-DD |
| TIME | -838:59:59 ~ 838:59:59 | 3B | 00:00:00 | HH:MM:SS |
| DATETIME | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 8B | 0000-00-00 00:00:00 | YYYY-MM-DD HH:MM:SS |
| TIMESTAMP | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 | 4B | 00000000000000 | YYYYMMDDHHMMSS |
| YEAR | 1901~2155 (4位) / 1970~2069 (2位) | 1B | 0000 | YYYY / YY |
TIMESTAMP 自動特性
- 插入 NULL → 當前時間戳。
- 首個 TIMESTAMP 列:INSERT/UPDATE 不賦值 → 自動設為當前時間。
- 顯式賦值 → 禁用自動特性。
- 記錄「創建時間 + 最後修改時間」技巧:修改時間列放前面,創建時間列用
NOW() 顯式初始化。
兩位數年份轉換規則
- 00~69 → 2000~2069
- 70~99 → 1970~1999
- 數值 0 → 0000(而非 2000)