今天有User告訴我說有一隻Job一直執行失敗,從失敗的原因來看,是資料的來源端資料長度太長導致,
但好奇的是,資料來源跟資料目的端的欄位長度設定都是一樣的,
為什麼會發生這種事?
首先,資料來源端是MSSQL,目的端是Oracle DB,
而User的Job本身也沒有記log,因此根本不知道是塞哪一筆資料時欄位過長的問題,
因此,就資料來源先透過以下的SQL確認哪個字串過長,
Select len(ext_no),ext_no From dbo.ext_data
order by 1 desc;
果然找到了一筆長度48的字串,但User很好奇的是,欄位長度兩個資料庫都是設定50,該字串也只有48,
為什麼會報錯呢??
問題是在於,MSSQL跟Oracle DB在字串長度上認知不一樣,
當MSSQL設定nvarchar(20)的時候,可以儲存20個中文字或40個英文字,
但在Oracle DB設定nvarchar2(20)的時候,只能儲存10個中文字或20個英文字,
測試如下:
MSSQL
先建立一個測試的Table
create table length_test(text nvarchar(20))
然後塞進10個中文字
然後多加一個字進去當然沒問題
確認長度
接著到Oracle DB的環境測試
一樣先建Table
create table length_test(text nvarchar2(20))
開始塞字串
接著一樣多加一個中文字測試,馬上就報錯了,
也可以看得出來,明明是塞入11個中文字,但錯誤訊息的長度是顯示22個,
因此如果未來有同樣類似有塞中文字串的需求,Oracle DB的欄位長度最好要是MSSQL的兩倍長,
才不容易碰到錯誤訊息。