在数据库中使用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));
}