修改oracle字符集

来源:互联网 发布:淘宝gta5刷钱真相 编辑:程序博客网 时间:2024/06/10 03:38
一、修改oracle字符集
由于Oracle 默认安装了SIMPLIFIED CHINESE_CHINA.WE8ISO8859P1字符集,不修改中文会出现乱码现象,输入如下命令:
[oracle@localhost ~]$sqlplus ‘/as sydba’
SQL>shutdown immediate
SQL>Startup restrict
SQL>select userenv('language') from dual;
SIMPLIFIED CHINESE_CHINA.WE8ISO8859P1
SQL>UPDATE sys.PROPS$ SET value$='ZHS16GBK' WHERE NAME='NLS_CHARACTERSET';
SQL>shutdown immediate
SQL>startup;
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
---------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK
这样把WE8ISO8859P1改变成'ZHS16GBK' 。
如果执行了修改字符后,重启oracle数据库仍然是WE8ISO8859P1字符集,请重启linux系统即可。


二、执行第一点中的修改后,数据库报错ora-06553:pls-553:character set name is not recognized


确认字符集是否修改的不彻底。
 
SELECT DISTINCT (NLS_CHARSET_NAME(CHARSETID)) CHARACTERSET,
                DECODE(TYPE#,
                     1,
                      DECODE(CHARSETFORM,
                         1,
                           'VARCHAR2',
                           2,
                           'NVARCHAR2',
                           'UNKOWN'),
                     9,
                    DECODE(CHARSETFORM,
                            1,
                           'VARCHAR',
                          2,
                           'NCHAR VARYING',
                          'UNKOWN'),
                    96,
                    DECODE(CHARSETFORM, 1, 'CHAR', 2, 'NCHAR', 'UNKOWN'),
                  112,
                  DECODE(CHARSETFORM, 1, 'CLOB', 2, 'NCLOB', 'UNKOWN')) TYPES_USED_IN
FROM SYS.COL$
WHERE CHARSETFORM IN (1, 2)
AND TYPE# IN (1, 9, 96, 112);


CHARACTERSET         TYPES_USED_IN
-------------------- -------------
AL16UTF16            NCHAR
AL16UTF16            NCLOB
AL16UTF16            NVARCHAR2
UTF8                 CHAR
UTF8                 VARCHAR2
WE8ISO8859P1         CHAR
WE8ISO8859P1         CLOB
WE8ISO8859P1         VARCHAR2
 
确实在数据库的列属性中仍然存在着多个字符集的设定,报错的原因。下面解决这个问题。
 
1.SHUTDOWN IMMEDIATE;
 2.STARTUP MOUNT;
 3.ALTER SYSTEM ENABLE RESTRICTED SESSION;
 4.ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
 5.ALTER SYSTEM SET AQ_TM_PROCESSES=0;
 6.ALTER DATABASE OPEN;
 9.COL VALUE NEW_VALUE CHARSET
 10.SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
 11.COL VALUE NEW_VALUE NCHARSET
 12.SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_NCHAR_CHARACTERSET';
 14.--INTERNAL_USE是没有写在文档中的参数,用以强制完成字符集一致化
 15.ALTER DATABASE CHARACTER SET INTERNAL_USE &CHARSET;
 16.ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE &NCHARSET;
 19.SHUTDOWN IMMEDIATE;
 20.STARTUP;
 21.-- 再次启动数据库一遍
 22.SHUTDOWN IMMEDIATE;
 23.STARTUP;
 
按照上面的步骤,一步一步来,一步不要少,完成以后,就OK了。
原创粉丝点击