[转载]ORACLE字符集设置

原文地址:ORACLE字符集设置作者:raining
最近新创建一个数据库,插入数据后竟然发现中文字符在数据库中显示为????,原来看过关于oracle字符集的文章,知道是字符集设置问题。在网上搜了些资料,修改了oracle的字符集,总结了一下。 
 
首先用sys用户登陆oracle
#sqlplus /nolog
SQL>conn sys/sys@score as sysdba;
 
查看服务器端字符集:
SQL>SELECT * FROM NLS_DATABASE_PARAMETERS;
看输出的NLS_CHARACTERSET 字段值,我原来的值是ISO88什么的,不正确。正确的一般服务器端为:ZHS16GBK,客户端也为:ZHS16GBK。
修改开始
 
先停止本数据库服务:
SQL>shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
这些信息是更改正确字符集后的提示信息,一般应该是英文的)

 

再启动数据库

SQL>startup   restrict;   此处要注意启动方式要加 restrict参数
ORACLE 例程已经启动。

Total System Global Area  603979776 bytes
Fixed Size                  1220796 bytes
Variable Size             180358980 bytes
Database Buffers          415236096 bytes
Redo Buffers                7163904 bytes
数据库装载完毕。
数据库已经打开。

 

修改字符集

SQL> alter session set sql_trace=true;

  Session altered.

SQL> alter system enable restricted session;

  System altered.

SQL> alter system set job_queue_processes=0;

  System altered.

SQL> alter system set aq_tm_processes=0;

    System altered.

SQL> alter database open;

  Database altered.

SQL> alter database character set zhs16gbk;
 Database altered.

有时执行alter database character set zhs16gbk;语句时会报错:

ORA-12712: new character set must be a superset of old character set

意思是新字符集不是原字符集超集,例如原字符集为ZHS16CGB231280,新字符集zhs16gbk,虽然新字符集比原字符集大,但不存在父子关系,通过以下语句会跳过超集检查:

SQL> alter database character set INTERNAL_USE ZHS16GBK;  

 

重启数据库

SQL> shutdown immediate;

SQL> startup;

没错误提示就成功了。
 
windows客户端更改字符集
在命令提示符下执行D:SET NLS_LANG=AMERICAN_AMERICA.ZHS16GBK 或者修改注册表里的HKEY_LOCAL_MACHINESOFTWAREOracleHOME0下,nls_lang=SIMPLIFIED CHINESE_CHINA.ZHS16GBK。
 
再此查看服务器端和客户端字符集设置应该已经修该过来了。
 
刚开始我用的是“update props$ set value$='ZHS16GBK' WHERE NAME='NLS_CHARACTERSET';”语句来修改的服务器端字符集,修改后客户端连接时总提示有错误,看来是有问题的,网上搜了下,8i后是不可以用这个方法修改的。
有用的两个连接:
 
 
 
原文地址:https://www.cnblogs.com/liuzhuqing/p/7481046.html