Oracle DBA 可能试过导入一个完整的数据库导出——他们只得到了有关字符集不兼容的警告。这个问题比较杂,因为默认字符集是 ASCII,而国际数据库推荐使用的字符集则是 Unicode 字符集之一,比如说 AL32UTF8。
我们很轻易在没有意识到数据库字符集不支持非 ASCII 数据之前已经建立了一个数据库并开始了开发。开发人员可以使用字符集扫描(CssCAN)工具来避免这个问题,该工具自动安装在 Oracle9i中。假如你正在使用其它的数据库版本,那么你可以从Oracle 技术网下载 CSSCAN。
在运行该工具之前,你需要安装属于 CSMIG 用户的一套表和过程。脚本csminst.sql要么在 Oracle Home之下的rdbms/admin 目录下,要么在可下载的发布版本中。运行这个脚本需要 DNA 账户(在 Oracle9i中以 SYSDBA 身份登录)。
在数据库上以 DBA 账户运行 CSSCAN 工具的方法是在命令行提示符下键入 CSSCAN /。该程序提示参数的方式与 EXP 类似。你可以在命令行以如下方式输入参数:
CSSCAN SYSTEM/MANAGER FULL=y TOCHAR=AL32UTF8 ARRAY=102400 PROCESS=3
键入 CSSCAN HELP=Y可以查看完整的参数列表。(要保证有要移值的字符集的标示符,比如说 AL32UTF8 或者 Oracle8 的 UTF8。)在运行了该工具之后,在当前的目录下可能创建了三个文件:scan.err、scan.out和 scan.txt。这些文件包含扫描的结果。
例如,我在一个 UTF-8 数据库中插入了chr(169)到一个文本列中。这个字符不是一个有效的 UTF-8 序列;而对于 Web 用户来说这是一个普通的字符。在scan.err中显示的 CSSCAN 的输出为:
User: SCOTT
Table : TMPTABLE
Column: TEXT
Type: VARCHAR2(2000)
Number of Exceptions : 1
Max Post Conversion Data Size: 1
ROWIDException TypeSize Cell Data(first 30 bytes)
----------------------------------------------------------------------------------------------
AAAHboAABAAAMYyAAA lossy conversion?
----------------------------------------------------------------------------------------------
在纠正了由该工具报告的这些错误之后,你就可以以目标字符集使用数据库移值工具(比如说dbassist)将数据移值到一个新数据库中了。