一直以來同事所做的報表有時會出現亂碼,同事便提議修改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;
沒有留言:
張貼留言