Java 類型

MySQL 推薦類型

核心用途

注意事項

整數型

byte / Byte

TINYINT(1 字節)

小範圍整數

範圍:-128~127

short / Short

SMALLINT(2 字節)

中等範圍整數(如序號)

較少直接使用,優先用 INT,範圍: -32768~32767

int / Integer

INT(4 字節)

最常用整數(ID、計數)

跨庫兼容性最好,範圍:-2147483648~2147483647

long / Long

BIGINT(8 字節)

大範圍整數(時間戳、大 ID)

範圍:-9223372036854775808~9223372036854775807

浮點型 / 高精度型

float / Float

FLOAT

低精度浮點數(圖形、非核心計算)

精度僅 6-7 位,避免用於金額、計算

double / Double

DOUBLE

普通精度浮點數(非金額計算)


精度 15-17 位,仍可能有精度丟失(如 0.1+0.2)

java.math.BigDecimal

DECIMAL(p,s)

高精度計算(金額、税率)

避免了浮點數精度問題,p 總長度,s 小數位數(如 DECIMAL(10,2) 存金額)

字符 / 字符串型

char / Character

CHAR(1)

單個字符(性別 M/F、狀態 Y/N)

固定長度 1,多餘字符補空格,適合單字符場景

String

VARCHAR(n)

變長字符串(姓名、描述)

n 是字符串長度,最大長度和字符集有關,總字節數不能超過 65535字節

String

TEXT(TINYTEXT/MEDIUMTEXT/LONGTEXT)

超長文本(備註、文章內容)

TINYTEXT255 字節

TEXT65,535 字節(約 64KB)

MEDIUMTEXT16,777,215 字節(約 16MB)

LONGTEXT4,294,967,295 字節(約 4GB)

布爾型

boolean / Boolean

TINYINT(1)(0=false,1=true)

邏輯判斷(是否啓用、是否刪除)


日期時間型

java.time.LocalDate

DATE

僅日期


java.time.LocalTime

TIME

僅時間


java.time.LocalDateTime

DATETIME / TIMESTAMP

日期 + 時間

DATETIME 因無時區隱式轉換的特性,是更安全的選擇;TIMESTAMP 僅在明確需要跨時區或自動更新時使用,且務必統一時區配置。

二進制型

byte[](字節數組)

BLOB(TINYBLOB/MEDIUMBLOB/LONGBLOB)

二進制數據(圖片、文件)

不推薦數據庫存大文件!小文件(如頭像 < 100KB)可用,大文件建議存 OSS,數據庫存文件 URL

BigDecimal 正確使用規範(避免所有精度問題)

  • 構造優先用字符串:new BigDecimal("0.1") 或 BigDecimal.valueOf(0.1),禁用 new BigDecimal(double)。若通過 new BigDecimal(double) 構造對象,會將 double 的精度丟失一併帶入,導致後續計算錯誤。
  • 運算指定舍入模式:除法(divide)必須指定 (scale, roundingMode),乘法(multiply)、減法(subtract)按需指定精度;
  • 比較用 compareTo():禁止用 equals() 比較數值相等。BigDecimal 的 equals() 方法會同時比較數值和精度,而 compareTo() 僅比較數值,用錯會導致邏輯錯誤。
  • 金額場景固定小數位數:如金額統一保留 2 位小數,避免精度不一致;
  • 避免頻繁轉換:減少 BigDecimal 與 double/float 的互轉,若必須轉換,先轉為字符串。

舍入模式

説明(適合場景)

ROUND_HALF_UP

四捨五入(日常計算、金額)

ROUND_DOWN

向下取整(如取整、不進位)

ROUND_UP

向上取整(如計費、不足 1 元按 1 元算)

ROUND_HALF_EVEN

銀行家舍入(四捨六入五取偶,金融場景)