在數據庫中使用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));
}