天天看點

Oracle的字元集:nls_database_parameters、nls_instance_parameters、nls_session_parameters

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