1、字元集命名
Oracle的字元集命名遵循以下命名規則:
<Language><bit size><encoding>
即: <語言><比特位數><編碼>
比如: ZHS16GBK表示采用GBK編碼格式、16位(兩個位元組)簡體中文字元集
例如:AL32UTF8(其中AL代表ALL,指适用于所有語言)
NLS_LANG=CHINESE_CHINA.ZHS16GBK
CHINESE是語言,CHINA是地區,ZHS16GBK 是用戶端字元集
NLS_CHARACTERSET是資料庫字元集,
NLS_NCHAR_CHARACTERSET是國家字元集
ORACLE中有兩大類字元型資料:
VARCHAR2是按照資料庫字元集來存儲資料;
NVARCHAR2是按照國家字元集存儲資料的;
同樣,CHAR和NCHAR也一樣,一是資料庫字元符,一是國家字元集。
字元集不同,二進制碼的組合就不同。
2、三種字元集說明
(1).oracle伺服器端字元集:
資料庫字元集在建立資料庫時指定,在建立後通常不能更改
伺服器端字元集的指令是: select * from nls_database_parameters
nls_database_parameters取值與props$,
即我們建立資料庫時存儲在資料庫中的熟悉資訊,這與環境變量和參數檔案等是統統沒有關系的。
(2).oracle用戶端字元集:
用戶端的字元集的設定,可能是參數檔案,環境變量或者是系統資料庫
用戶端字元集的指令是: select * from nls_instance_parameters
nls_instance_parameters取值與v$parameter
nls_instance_parameters的值由參數檔案決定,那麼會不會受到環境變量的影響呢?經驗證,是不會的!
(3).oracle會話字元集:
會話字元集是繼承用戶端字元集,如果設定環境變量可以覆寫會話字元集
會話字元集的指令是: select * from nls_session_parameters
nls_session_parameters 來源于v$nls_parameters,表示會話自己的設定,可能是會話的環境變量或者是alter session完成,
如果會話沒有特殊的設定,将與nls_instance_parameters一緻。
總結:
用戶端的字元集要求與伺服器一緻,才能正确顯示資料庫的非Ascii字元。
如果多個設定存在的時候,NLS作用優先級别:Sql function > alter session > 環境變量或系統資料庫 > 參數檔案 > 資料庫預設參數
字元集要求一緻,但是語言設定卻可以不同,語言設定建議用英文。如字元集是zhs16gbk,則nls_lang可以是American_America.zhs16gbk。
3、修改字元集方法
3.1 修改server端字元集(不建議使用)
1. 關閉資料庫
SQL>SHUTDOWN IMMEDIATE
2. 啟動到Mount
SQL>STARTUP MOUNT;
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL>ALTER DATABASE OPEN;
--這裡可以從父集到子集
SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;
SQL>ALTER DATABASE NATIONAL CHARACTER SET AL16UTF16;
--如果是從子集到父集,需要使用INTERNAL_USE 參數,跳過超子集檢測
SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;
SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL16UTF16;
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP
3.2用戶端字元集設定方法
1)UNIX環境
$NLS_LANG=“simplified chinese”_china.zhs16gbk
$export NLS_LANG
編輯oracle使用者的profile檔案
2)Windows環境
編輯系統資料庫
Regedit.exe ---》 HKEY_LOCAL_MACHINE ---》SOFTWARE ---》 ORACLE--》HOME
或者在視窗設定:
set nls_lang=AMERICAN_AMERICA.ZHS16GBK