hit counter for blogger

黑暗執行緒

 黑暗執行緒搬新家囉!! http://www.darkthread.net

11/24/2006

KB-在Oracle中直接取得中文字串長度

今天接到個頗具挑戰性的需求。

由於轉檔程式要輸出固定寬度的文字欄位,所以要視字串長度在後方補足空白。因中文字在不同Encoding下的長度不同(例如: BIG5 2bytes, UTF8 3bytes),加上中英文可能交雜,所以用.NET下的System.Text.Encoding.GetEncoding("big5").GetByteCount("中文字串ABC");是最簡便有效的方法(若是VBS、VB6,可以考慮用ADODB.Stream勉強替代)。
不過,問題來了。因為轉檔程式是別人寫好的,改不得,而它只能笨笨地接受從ORACLE資料庫端傳來補好空白的文字內容(這轉檔程式會不會太嬌生慣養呀?)。所以計算文字長度的事情得在ORACLE端搞定,HOW?

如果是SQL Server,我會用Collate處理編碼轉換,用DataLength來取真實資料長度。不過因為ORACLE中沒有直接對應的語法,拼拼湊湊一番,才總算找到解法:

  1. CONVERT Function: 可以將字串轉成不同的Charset
  2. RAWTOHEX Function: 可將欄位內容用16進位表示,所以其長度除2就是原欄位的Byte數!

把這些東西攪在一起,答案就出來了囉~~
(由以下的測試可以看出來,UTF8時,每個中文字要三個Byte,而BIG5只需要兩個)

OracleGetLenWithEncoding

0 Comments:

Post a Comment

<< Home