有個問題,沒有考慮中文編碼字符,由于遷移的表有幾千萬數(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:目標(biāo)字符集
source_charset:原字符集