NLS_CHARACTERSET是数据库字符集,NLS_NCHAR_CHARACTERSET是国家字符集
ORACLE中有两大类字符型数据,VARCHAR2是按照数据库字符集来存储数据。而NVARCHAR2是按照国家字符集存储数据的。同样,CHAR和NCHAR也一样,一是数据库字符符,一是国家字符集。
字符集不同,二进制码的组合就不同。
首先用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 JA16SJIS;
Database altered.
有时执行alter database character set JA16SJIS;语句时会报错:
ORA-12712: new character set must be a superset of old character set
意思是新字符集不是原字符集超集,例如原字符集为ZHS16CGB231280,新字符集zhs16gbk,虽然新字符集比原字符集大,但不存在父子关系,通过以下语句会跳过超集检查:
SQL> alter database character set INTERNAL_USE JA16SJIS;
重启数据库
SQL> shutdown immediate;
SQL> startup;
没错误提示就成功了。
再此查看服务器端和客户端字符集设置应该已经修该过来了