在 Oracle 數據庫中,當字段類型為 NUMBER(5,2)
且存儲的值為 0.1
時,Java 程序查詢結果可能顯示為 ".1"
(省略前導零),這是由 Oracle JDBC 驅動默認的數字格式化行為 導致的。以下是原因分析和解決方案:
原因分析
-
Oracle 的
NUMBER
類型特性NUMBER(5,2)
表示最多 5 位數字,其中 2 位是小數(范圍:-999.99
到999.99
)。- 當存儲
0.1
時,實際存儲的是精確值0.10
(補全小數位到 2 位),但查詢時會省略末尾的零。
-
JDBC 驅動的默認格式化
- Oracle JDBC 驅動(如
ojdbc8
)在返回NUMBER
類型時,默認會去除前導零(如0.1
→".1"
),這是為了減少不必要的字符。
- Oracle JDBC 驅動(如
-
Java 數據類型映射
NUMBER
字段會被 JDBC 驅動映射為BigDecimal
或Double
,而BigDecimal.toString()
默認會省略前導零。
解決方案
方法1:在 SQL 查詢中顯式格式化
使用 TO_CHAR
函數強制保留前導零:
SELECT TO_CHAR(your_number_column, '0.00') FROM your_table;
結果會固定為 "0.10"
(字符串類型)。
方法2:在 Java 中格式化結果
將查詢結果轉換為 BigDecimal
并手動格式化:
import java.math.BigDecimal;
import java.text.DecimalFormat;BigDecimal value = resultSet.getBigDecimal("your_column");
DecimalFormat df = new DecimalFormat("0.00"); // 強制保留兩位小數
String formattedValue = df.format(value); // 輸出 "0.10"
**方法3:修改 JDBC 驅動的格式化行為 **
在連接字符串中添加參數,關閉驅動的默認格式化:
String url = "jdbc:oracle:thin:@localhost:1521:ORCL?oracle.jdbc.defaultNumericChar=true";
注意:
此參數可能因驅動版本不同而失效,建議優先使用方法1或2。
方法4:直接處理結果集
如果查詢結果已經是字符串形式的 ".1"
,可以手動補零:
String rawValue = resultSet.getString("your_column");
if (rawValue.startsWith(".")) {rawValue = "0" + rawValue; // ".1" → "0.1"
}
驗證數據庫實際存儲值
執行以下 SQL,確認數據庫中實際存儲的值:
SELECT DUMP(your_number_column) FROM your_table;
- 輸出示例:
Typ=2 Len=2: 193,11
(表示存儲的是0.10
,但查詢時被格式化)。