要解決Java中BigDecimal
類型與SQL Server中real
類型沖突導致的varbinary與real不兼容
錯誤,請按以下步驟操作:
錯誤原因分析
-
類型映射錯誤:JDBC驅動嘗試將
BigDecimal
轉換為varbinary
(二進制類型),而非目標字段的real
類型。 -
根本原因:MyBatis等ORM框架未能自動推斷正確的JDBC類型(
REAL
),導致驅動使用默認的varbinary
處理。
解決方案(二選一)
? 方案1:顯式指定JDBC類型(推薦)
在MyBatis的SQL映射中,顯式聲明jdbcType=REAL
:
xml
復制
下載
運行
<!-- XML映射示例 --> <insert id="insertData">INSERT INTO your_table (your_real_column)VALUES (#{yourBigDecimalValue, jdbcType=REAL}) </insert>
java
復制
下載
// 注解映射示例 @Insert("INSERT INTO your_table (your_real_column) VALUES (#{value, jdbcType=REAL})") void insertData(@Param("value") BigDecimal value);
? 方案2:修改數據庫字段類型(治本)
將SQL Server的real
類型改為與BigDecimal
兼容的精確小數類型:
sql
復制
下載
ALTER TABLE your_table ALTER COLUMN your_real_column DECIMAL(18, 6) -- 根據需求調整精度
優勢:
-
徹底解決類型沖突
-
避免浮點數精度丟失(
real
是近似浮點,BigDecimal
需精確存儲)
關鍵注意事項
-
類型匹配原則:
-
real
?→ Java?float
?(4字節浮點) -
float
?→ Java?double
?(8字節浮點) -
decimal/numeric
?→ Java?BigDecimal
?(精確小數)
-
-
精度風險:
-
real
有精度損失風險(如存儲0.1
可能變為0.10000000149
) -
金融等場景必須使用
DECIMAL
類型
-
驗證步驟
-
檢查SQL Server列類型:
sql
復制
下載
SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'your_table'
-
確認ORM中
jdbcType=REAL
已正確添加 -
測試插入/更新操作
推薦選擇方案2:長期來看,使用
DECIMAL
類型能避免精度問題和類型映射隱患。若因歷史原因不能改庫,則必須使用方案1顯式指定jdbcType
。