gtag

2010年8月24日 星期二

NLS_NCHAR_CHARACTERSET 的相關觀念

一直以來同事所做的報表有時會出現亂碼,同事便提議修改NLS_NCHAR_CHARACTERSET的值來試試,是否能改變亂碼問題。
NLS_NCHAR_CHARACTERSET(本國字符集)指的是用在NCHAR、NCARCHAR2與NCLOB這三種文字型態的資料欄位編碼,有 UTF8與AL16UTF16兩種選擇。而報表使用 PL/SQL所產生的變數數值,會參考到環境變數NLS_LANG,與本國字符集完全無關,這也與OS及報表主機的OS有著不可拆分的關係。

當在OS為 LINUX時,改變NLS_NCHAR_CHARACTERSET卻可以讓報表顯示正常字,當OS為UNIX時,修改參數卻仍然是亂碼,這可以證明OS仍然有著很大的關係。

這裡也順便介紹如何更改NLS_NCHAR_CHARACTERSET的方法。


SQL> STARTUP MOUNT exclusive RESTRICT;
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1267068 bytes
Variable Size             150997636 bytes
Database Buffers          130023424 bytes
Redo Buffers                2924544 bytes
Database mounted.
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 NATIONAL CHARACTER SET INTERNAL_USE AL16UTF16;
Database altered.
SQL> SHUTDOWN IMMEDIATE;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> STARTUP;
ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size                  1267068 bytes
Variable Size             150997636 bytes
Database Buffers          130023424 bytes
Redo Buffers                2924544 bytes
Database mounted.
Database opened.

如果未使用INTERNAL_USE會出現ORA-12717的錯誤,因為在全資料庫中SYS,SYSTEM,XDB會使用到NCHAR等資料型別。

利用下列SQL可以確認是否修改成功

SQL> select * from v$nls_parameters where parameter ='NLS_NCHAR_CHARACTERSET';

PARAMETER                                VALUE
---------------------------------------- --------------------
NLS_NCHAR_CHARACTERSET                   UTF8

PS:若有啟用JOB,記得把JOB_QUEUE_PROCESSES設成非零的值

SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=10;

沒有留言:

張貼留言