再来回顾一下上一篇中的两条样本数据.
SQL> col col2 format a40
SQL> select col1, dump(col2) col2 from t_charset;
COL1 COL2
---------- ----------------------------------------
ZHS16GBK Typ=1 Len=6: 228,184,173,229,155,189
UTF8 Typ=1 Len=4: 214,208,185,250
其实csscan的工作原理和CONVERT函数一样, 如果数据库中存放的已经是UTF8字符集了, 那么肯定可以转换到UTFE字符集, 因此我们在使用csscan或CONVERT函数时, 源字符集指定为UTF8而目标字符集指定为UTFE(因为是UTF8的超集). 先测试第一条, 数据库中存放的不是UTF8格式的, 因此转换就报错了.
SQL> SELECT CONVERT(COL2,'UTF8','UTFE') FROM T_CHARSET WHERE COL1='UTF8';
*
ERROR at line 1:
ORA-12703: this character set conversion is not supported
测试另一条记录则可以成功转换, 没有报错.
SQL> SELECT CONVERT(COL2,'UTF8','UTFE') FROM T_CHARSET WHERE COL1='ZHS16GBK';
CONVERT(COL2,'UTF8','UTFE')
-----------------------------------------------
......
csscan程序可以找出所有含有字符字段的表中, 存放的内容不是指定字符集(如CONVERT函数转换报错)的记录, 将ROWID存放在预先创建好的表中. 然后你可以查询这些表, 将没有转换成目标字符集的记录处理掉.