20120412_更改Oracle字符集:把字符集ZHS16GBK換成UTF8

 

http://space.itpub.net/12778571/viewspace-624461

SQL> select name,value$ from props$ where name like '%NLS%';

NAME                           VALUE$
------------------------------ ------------------------------
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  AMERICA
NLS_CURRENCY                   $
NLS_ISO_CURRENCY               AMERICA
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET               ZHS16GBK
NLS_CALENDAR                   GREGORIAN
NLS_DATE_FORMAT                DD-MON-RR
NLS_DATE_LANGUAGE              AMERICAN
NLS_SORT                       BINARY
NLS_TIME_FORMAT                HH.MI.SSXFF AM

NAME                           VALUE$
------------------------------ ------------------------------
NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY              $
NLS_COMP                       BINARY
NLS_LENGTH_SEMANTICS           BYTE
NLS_NCHAR_CONV_EXCP            FALSE
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_RDBMS_VERSION              10.2.0.1.0

20 rows selected.

NLS_CHARACTERSET是數據庫字符集,NLS_NCHAR_CHARACTERSET是國家字符集
ORACLE中有兩大類字符型數據,VARCHAR2是按照數據庫字符集來存儲數據。
而NVARCHAR2是按照國家字符集存儲數據的。同樣,CHAR和NCHAR也一樣,一是數據庫字符符,一是國家字符集。


轉換字符集,數據庫應該在RESTRICTED模式下
首先要確定修改後的字符集是不是修改前的超集,如果不是可能出現相同的代碼點對應不同的字符,出現亂碼的問題。

出現這個錯誤是 oracle 只支持從子集到超集的轉變
那有什麼方法可進行強制轉換呢?
該指令會跳過子集與超集的檢驗,當然強制轉換可能會造成數據的損壞,要謹慎使用!!
下面藉助eygle的帖子執行。

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area 1845493760 bytes
Fixed Size                  2021568 bytes
Variable Size             452986688 bytes
Database Buffers         1375731712 bytes
Redo Buffers               14753792 bytes
Database mounted.
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 INTERNAL_USE UTF8;

Database altered.

SQL>update props$ set VALUE$='UTF8' where NAME='NLS_NCHAR_CHARACTERSET'


發佈了61 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章