日志文章

2007-06-28

oracle 修改数据库字符集后遗症处理

上回说到修改数据库字符集,修改过之后,倒入数据中的中文能够正常显示了,自以为大功告成,谁知,在做数据导出时出错了 $S"zxEJJ Y  
EXP-00008: 遇到 ORACLE 错误 6552 sV{b9=Wvk  
ORA-06552: PL/SQL: Compilation unit analysis terminated LL$ElM$7  
ORA-06553: PLS-553: character set name is not recognized @kJ un\5:  
EXP-00000: 导出终止失败 _qdNu@e>  
g8ETbfW91  
查了下,原来是上次修改数据库字符集的后遗症,在网上查找了处理方法,处方如下: H~`o~nQrX  
首先,确认字符集是否修改的不彻底。 mZqpypV[  
Po;#w  
SELECT DISTINCT (NLS_CHARSET_NAME(CHARSETID)) CHARACTERSET, uM1C|h)`Bc  
          DECODE(TYPE#, svHuFXfb  
              1, E]DgyeEa B  
              DECODE(CHARSETFORM, 3'*}Kdh 7-  
                    1, pX;q"`  
                    'VARCHAR2', 2C3?Uc0  
                    2, ,&kU\1fw  
                    'NVARCHAR2', !| Y*a(9  
                    'UNKOWN'), |d[3)mHQr  
              9, kbj KT$>  
              DECODE(CHARSETFORM, fIkZVd;  
                    1, [:-pZ 16uu  
                    'VARCHAR', jC1#&){ x  
                    2, xNA"?dw=O]  
                    'NCHAR VARYING', * *\:{d  
                    'UNKOWN'), E kZ`&af>  
              96, Q<[HwY6o9  
              DECODE(CHARSETFORM, 1, 'CHAR', 2, 'NCHAR', 'UNKOWN'), 6:ye73=h8  
              112, Pi h\~}!T.  
              DECODE(CHARSETFORM, 1, 'CLOB', 2, 'NCLOB', 'UNKOWN')) TYPES_USED_IN CT:J~<%O}  
FROM SYS.COL$ In)U@ Ta  
WHERE CHARSETFORM IN (1, 2) :1cH<5iC  
  AND TYPE# IN (1, 9, 96, 112); y|9O]>  
D]T]u.]  
CHARACTERSET       TYPES_USED_IN OKa-:DKy  
-------------------- ------------- 3+ d|8:hF  
AL16UTF16         NCHAR ^dh!?=%L  
AL16UTF16         NCLOB 9:4X]No<F  
AL16UTF16         NVARCHAR2 @"Hw {  
ZHS16GBK         CHAR [CV5*PP,wi  
ZHS16GBK         VARCHAR2 6?kF"/~  
WE8ISO8859P1       CHAR ILU6M@%L  
WE8ISO8859P1       CLOB nPuCi}AN  
WE8ISO8859P1       VARCHAR2 UK*cAf=}  
W[,3<|`T  
8 rows selected. PyH "*Kx"  
确实在数据库的列属性中仍然存在着多个字符集的设定,这是导致exp失败的原因。下面解决这个问题。 eY|#V}8w2  
7g(ZXwFI-5  
SHUTDOWN IMMEDIATE; -EE!TLS!  
STARTUP MOUNT; *&4NJ g9(d  
ALTER SYSTEM ENABLE RESTRICTED SESSION; S BwZM,D  
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; [G KdJ m  
ALTER SYSTEM SET AQ_TM_PROCESSES=0; qQnzA<  
ALTER DATABASE OPEN; tz;{'M7U;  
I]_Tg7c:  
HH:3'Ps;5  
COL VALUE NEW_VALUE CHARSET MSeYP6\G):  
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET'; }}S&Sbo  
COL VALUE NEW_VALUE NCHARSET +/uX62M  
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_NCHAR_CHARACTERSET'; <3R$<b._-  
Aq>6o!QC/  
--INTERNAL_USE是没有写在文档中的参数,用以强制完成字符集一致化 Z{}`w  
ALTER DATABASE CHARACTER SET INTERNAL_USE &CHARSET; J\bSHo ~  
ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE &NCHARSET; n6kFSj~T  
7kyc0/u8  
q`ZS2)s~G  
SHUTDOWN IMMEDIATE; IJ]:\A1  
STARTUP; 'ia RLA ,  
-- 再次启动数据库一遍 ?r Y)]  
SHUTDOWN IMMEDIATE; PN:hF1t v  
STARTUP; >g,xnHOjS  
按照上面的步骤,一步一步来,一步不要少,完成以后,重新检索col$表。 P%hfaA)  
2>RPH_P%NO  
CHARACTERSET       TYPES_USED_IN BTtHLSL  
-------------------- ------------- ]|Vo ;c  
AL16UTF16      NCHAR #~!Xys3*  
AL16UTF16      NCLOB ZSBk2Q=Ns  
AL16UTF16      NVARCHAR2 ^+{:3  
ZHS16GBK            CHAR TQ npFM  
ZHS16GBK            CLOB Mi\T N 9  
ZHS16GBK            VARCHAR2 }H?+43  
干净了,再次运行exp,大功告成。 gQO7vK{q  
感谢网上提供处理方法的兄弟啊:) sTz]yy#g  


类别: 学习笔记 |  评论(4) |  浏览(3356) |  收藏
一共有 4 条评论
vvstone 2007-08-07 17:45 Says:
自己的犯错记录,立此存照,以儆效尤:)
2007-08-07 13:49 Says:
非常感谢兄弟你啊!!!
发表评论
看不清楚,换一张