數據庫數據類型 - char() 填坑

此博客記錄一次數據庫數據類型 - char(10)造成的查詢記錄數目不匹配的問題,僅作相關參考。

問題描述:

在java中使用如下查詢語句獲得某個記錄在數據庫TB_A表中匹配次數。

select count(*) as NUM from TB_A where data_no = ?

然後使用ResultSet獲得NUM的值(中間setParameter之類的細節省略),然而得到的count值無論如何都是0,但是某些記錄確實在TB_A表中有匹配。

ResultSet rs = preparedStatement(SQL);
rs.next();
int count = rs.getInt("NUM");

範例:

此時有一個記錄data_no 是 '1001',也確實在數據庫中真實存在。

使用

select count(*) as NUM from TB_A where data_no = '1001'

 在SQLDeveloper中執行得到NUM的值爲1,但是JAVA程序執行後得到的卻是0。

經過不斷的排查,發現數據庫中TB_A的 data_no字段的數據類型爲 char(10)

char(10)和varchar2(10)有什麼區別?

char類型的字段長度是固定的,而varchar2類型的字段長度是不固定的。

拿本例來說:data_no 是 ‘1001’

如果data_no的數據類型是char(10),那麼該字段的實際存儲爲1001再補上6個空格。

而如果data_no的數據類型是varchar2(10),那麼該字段的實際存儲爲1001。

所以是char類型惹的禍。

解決方案:

將java中的sql語句修改爲:

select count(*) as NUM from TB_A where trim(data_no) = ?

總結:

當數據庫表的某個字段類型爲char()時,應當注意其自動填充空格補齊位數的特性。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章