首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Java 與 MySQL 數據類型映射對照表:JDBC Type、長度、封裝類完整指南

     編輯:MySQL 資料庫相關知識

核心映射表 (MySQL 8.0 / Connector/J 8.0 基準)

MySQL 類型顯示長度Java 類型 (推薦)JDBC Type (java.sql.Types)備註
VARCHAR(n)nStringVARCHAR (12)n ≤ 65535,utf8mb4 實際字節 ≤ 65532
CHAR(n)nStringCHAR (1)固定長度,右填充空格
TINYTEXT255StringVARCHAR (-1 / LONGVARCHAR)
TEXT65,535StringLONGVARCHAR (-1)
MEDIUMTEXT16,777,215StringLONGVARCHAR (-1)
LONGTEXT4,294,967,295StringLONGVARCHAR (-1)JDBC 獲取用 getClob/getString
TINYINT3Integer / BooleanTINYINT (-6)Boolean 映射需 tinyInt1isBit=false
SMALLINT5IntegerSMALLINT (5)
MEDIUMINT8IntegerINTEGER (4)JDBC 無 MEDIUMINT 常量
INT / INTEGER10Integer / LongINTEGER (4)Long 防溢出 (無符號 > 21億)
BIGINT20Long / BigIntegerBIGINT (-5)無符號需 BigInteger
FLOAT4+8FloatFLOAT (7)單精度,約 7 位有效數字
DOUBLE22DoubleDOUBLE (8)雙精度,約 15 位有效數字
DECIMAL(p,s)pBigDecimalDECIMAL (3)精確計算必須用 BigDecimal
BIT(n)nboolean / byte[]BIT (-7)BIT(1) 常映射 boolean
DATE10LocalDate / java.sql.DateDATE (91)Java 8+ 用 LocalDate
TIME8LocalTime / java.sql.TimeTIME (92)Java 8+ 用 LocalTime
DATETIME19LocalDateTime / TimestampTIMESTAMP (93)無時區,5.6.4+ 支援毫秒
TIMESTAMP19Instant / TimestampTIMESTAMP (93)有時區,UTC 存儲,自動轉換
YEAR4Integer / YearDATE (91) / INTEGERMySQL 8.0 移除 YEAR(2)
BLOB 系列-byte[] / BlobBLOB (-4) / VARBINARY大對象用 getBlob/getBytes
JSON-String / JsonNodeVARCHAR / OTHER8.0 原生,建議 String 存儲
ENUM/SET-StringVARCHAR / OTHER應用層建議用 Enum 類型

關鍵映射決策點

1. TINYINT(1) → Boolean 還是 Integer?

# 連接串參數控制
tinyInt1isBit=true   # 默認 true:TINYINT(1) → Boolean
tinyInt1isBit=false  # TINYINT(1) → Integer (推薦,避免 ORM 映射混淆)

2. 無符號類型處理

  • MySQL INT UNSIGNED 範圍 0 ~ 42.9 億,超過 Java Integer.MAX_VALUE (21.4 億)
  • 映射策略:
      li>讀取:Long / BigInteger
    • 寫入:應用層校驗範圍,或用 UNSIGNED 列配合 Long

3. 日期時間類型與時區

類型時區行為Java 8+ 推薦連接串建議
DATETIME無時區,存什麼取什麼LocalDateTimeserverTimezone=UTC
TIMESTAMP存儲 UTC,讀取轉連接時區Instant / OffsetDateTimeserverTimezone=Asia/Shanghai

4. DECIMAL 精確計算

// ❌ 錯誤:Double 精度丟失
double amount = rs.getDouble("price"); 

// ✅ 正確:BigDecimal 精確
BigDecimal amount = rs.getBigDecimal("price"); 

// JPA/Hibernate 映射
@Column(precision = 19, scale = 4)
private BigDecimal price;

5. BLOB 讀寫最佳實踐

// 寫入
try (InputStream is = new FileInputStream(file)) {
    ps.setBinaryStream(1, is, file.length());
    ps.executeUpdate();
}

// 讀取 (大對象分塊)
Blob blob = rs.getBlob("data");
try (InputStream is = blob.getBinaryStream();
     OutputStream os = new FileOutputStream("out")) {
    byte[] buf = new byte[8192];
    int len;
    while ((len = is.read(buf)) > 0) os.write(buf, 0, len);
}

連接串完整參數模板 (Connector/J 8.0+)

jdbc:mysql://localhost:3306/mydb?
useUnicode=true&
characterEncoding=utf8mb4&
serverTimezone=Asia/Shanghai&
tinyInt1isBit=false&
useSSL=false&
allowPublicKeyRetrieval=true&
nullNamePatternMatchesAll=true&
connectionCollation=utf8mb4_general_ci

總結

類型映射不是「照表對照」那麼簡單,**無符號溢出、時區轉換、精度丟失、Boolean 映射、大對象流式處理** 才是生產環境的真實挑戰。建立團隊統一的「類型映射規範文檔」,Code Review 時重點檢查,能消除 90% 的持久層 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved