轉(zhuǎn)帖|其它|編輯:郝浩|2011-05-18 15:04:52.000|閱讀 871 次
概述:今天有一個同事的數(shù)據(jù)遷移程序有個問題,沒有考慮中文編碼字符,由于遷移的表有幾千萬數(shù)據(jù),但是有中文的記錄集很少,問我能否找出有中文內(nèi)容的記錄數(shù)。首先我想到的是采用檢測每個字節(jié)ASCII的方式,這樣的話需要寫一個自定義函數(shù),然后SQL中調(diào)用得到結(jié)果。但是感覺這個方法估計很耗時,畢竟每個字符都要比較,所以沒有去實現(xiàn)。突然想到Oracle有一個編碼轉(zhuǎn)換的函數(shù)叫Convert,如果一個字符串編碼轉(zhuǎn)換前后不一樣就表示字符串里面含有非 ASCII字符,這樣就得到結(jié)果。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
今天有一個同事的數(shù)據(jù)遷移程序有個問題,沒有考慮中文編碼字符,由于遷移的表有幾千萬數(shù)據(jù),但是有中文的記錄集很少,問我能否找出有中文內(nèi)容的記錄數(shù)。首先我想到的是采用檢測每個字節(jié)ASCII的方式,這樣的話需要寫一個自定義函數(shù),然后SQL中調(diào)用得到結(jié)果。但是感覺這個方法估計很耗時,畢竟每個字符都要比較,所以沒有去實現(xiàn)。突然想到Oracle有一個編碼轉(zhuǎn)換的函數(shù)叫Convert,如果一個字符串編碼轉(zhuǎn)換前后不一樣就表示字符串里面含有非ASCII字符,這樣就得到結(jié)果。最后寫出來測試了一下,確實可行,5500萬記錄10秒鐘就掃描結(jié)束。以下是測試用例:
SQL> select *
2 from (select 'abcd' c1 from dual
3 union all
4 select 'ab測試cd' c1 from dual)
5 where c1 <> CONVERT(c1, 'US7ASCII', 'ZHS16GBK');
C1
--------
ab測試cd
CONVERT函數(shù)說明:
CONVERT(inputstring,dest_charset,source_charset)
inputstring:要轉(zhuǎn)換的字符串
dest_charset:目標字符集
source_charset:原字符集
這只是一個小技巧,也許有一天你也有這樣的需求,或許能派上用場。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載