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));
  }

在這裏插入圖片描述

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