之前裝起來的 Oracle 10g 竟然放中文字進去會變成一堆問號。
於是下指令看看:
SELECT parameter, value FROM v$nls_parameters WHERE parameter LIKE '%CHARACTERSET';
竟然出現:
PARAMETER
------------------------
VALUE
------------------------
NLS_CHARACTERSET
WE8ISO8859P1
NLS_NCHAR_CHARACTERSET
AL16UTF16
主要是這個:NLS_CHARACTERSET
我想要可以放中文,而且是 UTF-8
找到一些適用於 9i 的步驟,試過之後,10g 也適用:
以 sysdba 角色進入 sqlplus 之後執行以下
shutdown immediate;
STARTUP MOUNT;
ALTER SESSION SET SQL_TRACE=TRUE;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET AL32UTF8;
ALTER SESSION SET SQL_TRACE=FALSE;
然重新啟動 oracle 就好了。
當然,這種方式會造成裏面的資料亂掉。應該要先把DB內清空再來做。
P.S. 因應 UTF-8, 環境變數 NLS_LANG 為:TRADITIONAL CHINESE_TAIWAN.AL32UTF8
P.S. 注意:網路上廣為流傳的用這種方法是不正確的: update props$ set value$='AL32UTF8' where name='NLS_CHARACTERSET';
透過前述 "ALTER DATABASE CHARACTER SET" 方式更改 characterset 時,Oracle至少需要更改 12 張 data dictionary,而這種直接更新 props$ 表的方式只完成了其中十二分之一的工作,其潜在的完整性隱憂可想而知。
參考出處:字符集问题的初步探讨(三) --字符集的更改(Eygle)
迴響