有個問題,沒有考慮中文編碼字符,由于遷移的表有幾千萬數據,但是有中文的記錄集很少,問我能否找出有中文內容的記錄數。首先我想到的是采用檢測每個字節ASCII的方式,這樣的話需要寫一個自定義函數,然后SQL中調用得到結果。但是感覺這個方法估計很耗時,畢竟每個字符都要比較,所以沒有去實現。突然想到Oracle有一個編碼轉換的函數叫Convert,如果一個字符串編碼轉換前后不一樣就表示字符串里面含有非ASCII字符,這樣就得到結果。最后寫出來測試了一下,確實可行,5500萬記錄10秒鐘就掃描結束。以下是測試用例:
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函數說明:
CONVERT(inputstring,dest_charset,source_charset)
inputstring:要轉換的字符串
dest_charset:目標字符集
source_charset:原字符集