天天看點

達夢資料庫遇到“字元串截斷”該怎麼辦

最近工作中發現某應用執行操作報錯“字元串截斷”,找到對應sql語句後發現問題出在cast強制轉換這裡,經過簡化重制,其報錯sql的本質如下:

select cast(to_number(123) as varchar2(1)) p6 from dual;

達夢資料庫遇到“字元串截斷”該怎麼辦

可以看出當要把資料類型為number的數字強制轉換成小于其自身長度的字元串類型時才會報錯。找到出問題的本質其實就很好規避這個報錯了,下面就這個問題讨論一下不同資料類型下的cast會有什麼不同的表現嗎?這裡我們主要讨論不同資料類型下轉換成小于其本身長度的varchar2類型。

1.number類型cast成長度更短的 varchar2

select cast(to_number(123) as varchar2(1)) p6 from dual; 

達夢資料庫遇到“字元串截斷”該怎麼辦

這種場景下的“字元串截斷”報錯可以引申到numeric,dec,number,float,double等類型上。

2.int類型cast成長度更短的 varchar2

select cast(123 as varchar2(1)) p6 from dual;

達夢資料庫遇到“字元串截斷”該怎麼辦

可以看到int類型與上述的number類型報錯表現是不同的,報錯提示“資料轉換丢失警告”,這種報錯可以引申到bigint,tinyint,smallint等整數類型上。

3.varhcar2類型cast成長度更短的varhcar2

select ‘123’,cast(‘123’ as varchar2(1)) p6 from dual; 

達夢資料庫遇到“字元串截斷”該怎麼辦

可以看到varchar2類型cast成長度更短的varchar2類型可以執行成功,相當于自動做了字元串截斷,效果等同于left(123,1)。同樣的,char類型的表現與varchar2是相同的,也可以執行成功,在此不再贅述。