日期:2014-05-16  浏览次数:21597 次

oracle字符集问题(us7ascii 转 zhs16gbk)
数据库是Oracle9i的,但字符集设置的是:us7ascii,而正常保存中文数据的数据库字符集是:zhs16gbk。 
请问各位Oracle有没有什么内置的函数,可以将us7ascii字符集下的数据转换成zhs16gbk下的数据,并且能正常显示中文。 

我试过用convert函数不管用,utl_raw.cast_to_varchar2()和UTL_RAW.CAST_TO_RAW()联合使用也不管用。 

我的意思是:现有两个Oracle数据库:A(字符集为us7ascii的库)和B(字符集为zhs16gbk的库) 
假如我在A数据库中查询:select a.name from A a 
如果不做任何处理就把name的值插入到B数据库中,数据肯定是乱码。 
要怎样处理才能使B数据库中name的值正常显示中文? 

请教各为高手!!! 分不够可再加,先谢过!

------解决方案--------------------
试一下以下的方法:(基于WINDOWS操作系统)
在A数据库上:
(1)打开CMD
(2)设置参数NLS_LANG='simplified chinese'_china.zhs16gbk;
(3)执行EXP命令.
在B数据库上:
(1)执行IMP命令.
可以解决你的问题


------解决方案--------------------
修改Oracle字符集(character set)
本方法适用于Oracle9i, 10g以及XE. 在10.2.0.1.0下测试无错. 需要注意的是, 使用此方法会破坏数据库中的原有双字节字符. 一种办法是先将数据库导出, 修改完字符集后再导入; 另一种办法就是不管他, 就那样使用. 一般如果是一个测试环境, 像方法二那样就可以了, 但是可能某些表无法读取, 需要注意.
 
sql> shutdown immediate
sql> startup mount
sql> alter system enable restricted session;
sql> alter system set job_queue_processes=0;
sql> alter system set aq_tm_processes=0;
sql> alter database open;
sql> alter database character set <internal_use> AL32UTF8;
sql> shutdown immediate
sql> startup
 
这里的INTERNAL_USE可选,譬如用于不能从父集转到子集的场合,但是这样做会产生乱码,或者表中的数据不能读取。
 
如果数据库中存在CLOB字段,那么就不允许对字符集进行转换,此时可以查看alert<sid>.log文件,把含有CLOB的表trancate.
 
sql> trancate table [table_name];
 
转换后的数据库字符集可以通过以下命令察看.
 
sql> select name, value$ from props$ where name like '%NLS%'; 

从网上找来的,不难呀?哪里看不明白,就再发出来
------解决方案--------------------
下面的楼主参考一下:

一、字符集参数
一旦数据库创建后,数据库的字符集是不能改变的。因此,考虑使用哪一种字符集是十分重要的。数据库字符集应该是操作系统本地字符集的一个超集。存取数据库的客户使用的字符集将决定选择哪一个超集,即数据库字符集应该是所有客户字符集的超集。
下面介绍一些与字符集有关的NLS_LANG参数:
NLS_LANG格式:NLS_LANG=language_territory.charset
有三个组成部分(语言、地域和字符集),每个组成成分控制了NLS子集的特性。三个成分可以任意组合,例如:
AMERICAN_AMERICA.US7SCII
JPANESE_JAPAN.JA16EUC
其中:language 指定服务器消息的语言。
territory 指定服务器的日期和数字格式。
Charset 指定字符集
还有一些子集可以更明确定义NLS_LANG参数:
NLS_DATE_FORMAT 缺省的日期格式
NLS_DATE_LANGUAGE 缺省的日期语言
NLS_NUMBERIC_CHARACTERS 小数字符和组分隔开
NLS_CURRENCY 本地货币字符
NLS_ISO_CURRENCY ISO货币字符
NLS_SORT 字符排序序列
二、字符集转换
1、NLS_LANG参数的修改方法:
1)用SYS用户名登陆ORACLE。
2)查看字符集内容
SQL>SELECT * FROM PROPS$;
3)修改相应的字符子集
SQL>UPDATE PROPS$ SET VALUE$=’SIMPLIFIED CHINESE ‘
WHERE NAME=’NLS_LANGUAGE’;
4) 递交COMMIT;
2、NLS_LANG参数的具体应用:
1)采用服务器端/客户端方式,两端字符集不同
修改客户端字符集:
WIN:修改注册表
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\NLS_LANG
UNIX:按照1方法,直接进入ORACLE 修改。
2)不同字符集使用EXP/IMP命令
按照1方法,修改IMP端的字符集设置,如果是WIN系统,还必须修改注册表。注意:NLS_LANG三个子集的参数必须一致。另外,如果字符集单双字节设置不同,则不能通过修改字符集进行转换。可以使用其他方式,不修改字符集,进行ORACLE数据库搬移,如数据量比较小,可以使用SQLLOAD命令,通过文本文件转换;使用其他数据库软件(ACCESS,FOXPRO等)转换。

------解决方案--------------------
访问不同字符集的数据库,是这个意思吧
用与A一样的字符集联A库,读出数据,断开连接,将环境变量(或改注册表)改为B库字符集,保存数据。

------解决方案--------------------
探讨
那么不通过建表或视图的方式,直接查询可以么?
比如:select utl_raw.cast_to_varchar2(utl_raw.cast_to_raw(x)) from tab@Blink