核心類型映射表
| MySQL 類型 | 顯示長度 | Java 類型 | JDBC Type (int) | 備註 |
| VARCHAR | L+N | java.lang.String | 12 (VARCHAR) | 最常用字符串 |
| CHAR | N | java.lang.String | 1 (CHAR) | 定長,自動填充空格 |
| TEXT | 65535 | java.lang.String | -1 (LONGVARCHAR) | 大文本,避免 SELECT * |
| BLOB | L+N | byte[] | -4 (BLOB) | 二進制數據,圖片/文件 |
| TINYINT | 3 | Integer | -6 (TINYINT) | -128~127 |
| TINYINT UNSIGNED | 3 | Integer | -6 | 0~255,常用作 Boolean |
| SMALLINT | 5 | Integer | 5 (SMALLINT) | -32768~32767 |
| MEDIUMINT | 8 | Integer | 4 (INTEGER) | -8388608~8388607 |
| INT / INTEGER | 10 | Integer / Long | 4 (INTEGER) | 主鍵首選 Long |
| BIGINT | 20 | Long / BigInteger | -5 (BIGINT) | 大整數、雪花 ID |
| FLOAT | 4+8 | Float | 7 (REAL) | 單精度,避免金額計算 |
| DOUBLE | 22 | Double | 8 (DOUBLE) | 雙精度,科學計算 |
| DECIMAL | 11 | BigDecimal | 3 (DECIMAL) | 精確計算,金額必用 |
| BIT | 1 | Boolean | -7 (BIT) | MySQL 8.0+ 推薦 BOOLEAN 別名 |
| DATE | 10 | java.sql.Date | 91 (DATE) | 年月日 |
| TIME | 8 | java.sql.Time | 92 (TIME) | 時分秒 |
| DATETIME | 19 | java.sql.Timestamp | 93 (TIMESTAMP) | 無時區,5.6+ 支持微秒 |
| TIMESTAMP | 19 | java.sql.Timestamp | 93 | UTC 存儲,時區感知 |
| YEAR | 4 | java.sql.Date | 91 | 1901~2155 |
特殊類型處理建議
BLOB / 圖片存儲
- Java 對應
byte[],JDBC setBytes()/getBytes()。
- 大文件建議存對象存儲(S3/MinIO),DB 只存 URL + 元數據。
Boolean 選型
- MySQL 無原生 Boolean,
BOOLEAN 實為 TINYINT(1)。
- Java 用
Integer (0/1) 或 Boolean,MyBatis/JPA 自動映射。
- 避免用
BIT(1),JDBC 驅動行為不一,易發生 ClassCastException。
時間類型時區陷阱
DATETIME:不存時區,應用層統一用 UTC 寫入,讀取後按業務時區展示。
TIMESTAMP:存儲 UTC,讀取自動轉換為會話時區(time_zone 變量)。跨時區應用首選。
- JDBC URL 加
serverTimezone=UTC 統一協調。
MyBatis / JPA 映射提示
-- MyBatis resultMap
-- JPA Entity
@Column(name = "amount", precision = 19, scale = 4)
private BigDecimal amount;