转换前要搞清楚的
1.在Oracle9i中,如果数据库存在CLOB类型字段,那么就不允许利用ALTER DATABASE CHARACTER SET对字符集进行转换
2 a字符集转为b字符集b应该是a字符集的超级,否则的话转换肯定会丢失数据!需要特殊处
3 Oracle 的语言和字符集设定分为两部分,服务器端的字符,客户端的字符集。
当你在本机利用sqlplus连接oracle服务器时sqlplus也被看做是客户端!
客户端采用何种字符集处理数据是由注册表中的NLS_LANG参数决定的,如果这个参数为空,则客户端根据服务器端相应参数来(nls_instance_parameters)处理字符集,
4 NLS_LANG=<Language>_<Territory>.<Clients Characterset
NLS_LANG各部分含义如下:
LANGUAGE指定:
-Oracle消息使用的语言
-日期中月份和日显示
TERRITORY指定
-货币和数字格式
-地区和计算星期及日期的习惯
CHARACTERSET:
-控制客户端应用程序使用的字符集
通常设置或者等于客户端(如Windows)代码页
或者对于unicode应用设置为UTF8
在Windows上查看当前系统的代码页可以使用chcp命令:
如果进行从WE8MSWIN1252到UTF8的转换
1)使用NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252导出数据库。
这时创建的导出文件包含WE8MSWIN1252的数据
2)导入时使用NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
这时转换仅发生在insert数据到UTF8的数据库中(这一步是oracle自动转换的)。
导入的转换过程
1.确定导出数据库字符集环境
通过读取导出文件头,可以获得导出文件的字符集设置
2.确定导入session的字符集,即导入Session使用的NLS_LANG环境变量
3.IMP读取导出文件
读取导出文件字符集ID,和导入进程的NLS_LANG进行比较
4.如果导出文件字符集和导入Session字符集相同,那么在这一步骤内就不需要转换
如果不同,就需要把数据转换为导入Session使用的字符集。
然而这种转换只能在单byte字符集之间进行。
不要利用 ALTER DATABASE CHARACTER SET 来更还字符集,这个命令不会对已有数据进行转换,只是影响以后的数据。而且问题多多,只有一种好的方式那就是重建database 、exp、imp!!
这里是eygle的帖子,讲的很清楚
http://www.eygle.com/special/NLS_CHARACTER_SET_04.htm