此博客記錄一次數據庫數據類型 - 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()時,應當注意其自動填充空格補齊位數的特性。