【问题标题】:why oracle jdbc driver truncate leading zero when convert number to string为什么在将数字转换为字符串时oracle jdbc驱动程序会截断前导零
【发布时间】:2017-08-15 09:04:01
【问题描述】:

当db中的字段类型为数字,java bean的字段类型为字符串时,oracle jdbc驱动会将数字转为字符串,前导零被截断,如0.5转为.5

我追踪了oracle的jdbc驱动实现的源码,然后在oracle.jdbc.driver.NumberCommonAccessor的类中找到了下面这段代码:

String getString(int var1) throws SQLException {
   byte[] var3 = this.rowSpaceByte;
            int var4 = this.columnIndex + this.byteLength * var1 + 1;
            byte var5 = var3[var4 - 1];
            byte[] var6 = new byte[var5];
            System.arraycopy(var3, var4, var6, 0, var5);
            NUMBER var7 = new NUMBER(var6);
            String var8 = NUMBER.toString(var6);
            int var9 = var8.length();
            **if(var8.startsWith("0.") || var8.startsWith("-0.")) {
                --var9;
            }**

            if(var9 <= 38) {
                return var7.toText(38, (String)null).trim();
            } else {
                var8 = var7.toText(-44, (String)null);
                int var10 = var8.indexOf(69);
                int var11 = var8.indexOf(43);
                if(var10 == -1) {
                    var10 = var8.indexOf(101);
                }

}

【问题讨论】:

  • 这个 NumberCommonAccessor 是一些新的 ojdbc jar 的一部分吗?以前我从来没有遇到过这个问题,但现在我也遇到了这个问题。

标签: java oracle jdbc


【解决方案1】:

为什么 oracle jdbc 驱动程序在将数字转换为时截断前导零 字符串

隐式转换就是这样工作的。数字数据类型没有任何前导 0,
2 只是 2,不是 002 不是 00000002。
您可以在查询中使用to_char 函数将数字转换为使用某种带有前导零的格式的字符串,例如:

select to_char( 1,'09999' ) as X,
       to_char( 22, '0999999999' ) as y
from dual;

X      Y         
------ -----------
 00001  0000000022

【讨论】:

  • 但是为什么jdbc驱动将相同的值转换为java的数字数据类型(如int或long)时没有这种转换呢?
猜你喜欢
  • 2011-10-05
  • 1970-01-01
  • 2014-05-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多