執行DB2更新語句:
update table set column1=361755*10000 where name= 'xxx';
時,報數據溢出錯誤:
Arithmetic overflow or other arithmetic exception occurred. SQL Code: -802, SQL State: 22003
經查詢,table表中的column1字段定義為Decimal(24,6),按照常識是可以執行成功的,但是DB2卻報溢出錯誤。
改變寫法:
1、update table set column1=361755 where name= 'xxx';
update table set column1=column1*10000 where name= 'xxx';
2、update table set column1=361755*bigint(10000) where name='xxx';
3、update table set column1=float(361755)*10000 where name='xxx';
以上方法均執行成功。
為什么DB2會報這種錯誤?如果是剛接觸DB2或者是沒學過DB2的基本理論,或者是從Oracle等其他數據庫直接轉移到DB2數據庫的人來說(我就是從Oracle直接轉到DB2的,很少看DB2的理論知識,因為DB2太高深了),這種錯誤不可思議,因為字段定義的是Decimal,是不應該發生溢出的。但是,如果看過DB2的基本類型后,應該就會有所了解:
DB2數字類型:
1. SMALLINT ---短整型,范圍為-32768~+32767,一遍用的較少
2. INT/INTEGER ---整型,4個字節,范圍為-2147483648~+2147483647,一遍多用於做自動生成的序列,或者用作表記錄的id使用。
3. BIGINT ----大整型,8個字節,精度為19位,夠大了,一般較少使用。
4. DECIMAL(P,S) ---小數型,其中P為精度,S為小數位數,隱含小數點(小數點不計入位數)。
所以,對於改變寫法后的第1中寫法,用column1=column1*10000,肯定不會報溢出錯誤,因為column1字段本身就是Decimal類型的。
對於第2、第3中寫法,由於是將數據轉換為了Decimal或bigint類型,所以也不會溢出。
而如果直接set column1=361755*10000,編譯工具會將兩個數字默認為int類型,結果也會超過int范圍,所以報錯。
DB2總是給人驚喜,但其實還是自己學藝不精,忽略了這些細節。