[Mixed] 資料庫字串長度計算方法

今天有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的兩倍長,

才不容易碰到錯誤訊息。