informix数据库查询decimal精度问题

在数据库中使用decimal(m,n)时大家都知道表示这个可以存总长为m个长度的十进制数,小数部分为n个长度。但当我们需要进行异库数据迁移时,就需要原封不动的把表结构一并移植过去。 在oracle、db2等中,我们查询表结构时,对应字段类型为decimal时,都对应一个精度,长度。 例如: decimal(10,5)对应长度为10,精度为5。 但在informix下就不起作用了,如下图:
建表时设置的是 decimal(32,5)
在这里插入图片描述
查询时:
在这里插入图片描述

what ? 怎么变成这样啦? 这个值是怎么来的?

informix底层存这个时是做了一个运算的:

collength = m << 8 | ( n & 0xff )

所以上面结果就是这样了:
在这里插入图片描述
我们可以看到,其实就是为了节约额外的2个字段,使用一个字段来存储精度。 把m左移8位与n或运算,其实就是把n放到后面去, 因为n最大255,所以8位足够。所以我们建表时就需要反解出m和n。 使用如下就行:

@Test
  public void test() {
  	// decimal(32,5)
  	System.out.println( 32 << 8 | ( 5 & 0xff ));
  	
  	
  	System.out.println("m = " + (8197 >> 8));
  	System.out.println("n = " + (8197 & 255));
  }

在这里插入图片描述

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