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

Davis_itpub發表於2018-06-27

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'

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31520497/viewspace-2156858/,如需轉載,請註明出處,否則將追究法律責任。

相關文章