Oracle11g字元亂碼解決

woshishui11211發表於2015-04-15

Oracle11g字元亂碼解決

 

1.      檢視linux支援語言

# cat /etc/sysconfig/i18n

LANG="en_US.UTF-8"

SYSFONT="latarcyrheb-sun16"

 

2.      建立例項選擇AL32UTF8

clip_image002

 

3.      三層NLS體系

任何一個會話session在連線入資料庫之後,都會面對三層NLS引數體系,分別為:DatabaseInstanceSession

 

ü  Database Level NLS Parameter:資料庫層面的NLS引數是在資料庫建立的時候確定的一系列的引數。在建立資料庫的時候,我們都可以通過OUI或者responseFile進行配置。大部分Database Level NLS Parameter都是不可以改變,或者不能輕易改變的,如CharacterSet

 

ü  Instance Level NLS Parameter:在資料庫執行過程中,一些NLS引數是通過Spfile/Pfile引數檔案進行配置,並且可以對Database Level NLS進行一定的覆蓋修改。如果Instance LevelDatabase Level的發生衝突,以Instance Level覆蓋Database Level的配置;

 

ü  Session Level NLS Parameter:這個層面是和使用者連線效果最直接的層面。使用者使用的NLS引數很多都是取到這個層面的引數。Session Level Parameter來自客戶端配置內容,主要是通過一系列的環境變數來確定。Session LevelParameter是可以覆蓋Instance Level的引數的;

 

4.      Database Level NLS Parameter

Database level引數是三層體系中最底層,這個層面的引數取值和Oracle資料庫建立時的配置選項密切相關。

SQL> select * from nls_database_parameters;

 

PARAMETER                                      VALUE

--------------------------------------------- -------------------------

NLS_LANGUAGE                                        AMERICAN

NLS_TERRITORY                                        AMERICA

NLS_CURRENCY                                         $

NLS_ISO_CURRENCY                                AMERICA

NLS_NUMERIC_CHARACTERS                                  .,

NLS_CHARACTERSET                                AL32UTF8

NLS_CALENDAR                                         GREGORIAN

NLS_DATE_FORMAT                                DD-MON-RR

NLS_DATE_LANGUAGE                            AMERICAN

NLS_SORT                                           BINARY

NLS_TIME_FORMAT                                HH.MI.SSXFF AM

 

PARAMETER                                      VALUE

--------------------------------------------- -------------------------

NLS_TIMESTAMP_FORMAT                              DD-MON-RR HH.MI.SSXFF AM

NLS_TIME_TZ_FORMAT                         HH.MI.SSXFF AM TZR

NLS_TIMESTAMP_TZ_FORMAT                     DD-MON-RR HH.MI.SSXFF AM

                                                     TZR

 

NLS_DUAL_CURRENCY                            $

NLS_COMP                                         BINARY

NLS_LENGTH_SEMANTICS                               BYTE

NLS_NCHAR_CONV_EXCP                                FALSE

NLS_NCHAR_CHARACTERSET                                  AL16UTF16

NLS_RDBMS_VERSION                            11.2.0.3.0

 

Oracle官方推薦的角度,我們設定AL32UTF8字符集作為資料庫字符集

 

5.      Instance level NLS Parameter

Instance引數主要來自於引數檔案SPFILE/PFILE。我們可以通過nls_instance_parameters來檢視這個層面的引數配置

SQL> select * from nls_instance_parameters;

 

PARAMETER                                      VALUE

--------------------------------------------- -------------------------

NLS_LANGUAGE                                        AMERICAN

NLS_TERRITORY                                        AMERICA

 

通常我們不會在引數檔案層面進行NLS引數配置,保持Database Level的預設配置就可以了。

 

6.      Session Level NLS Parameter

Session LevelNLS引數是和使用者最直接互動的部分。我們可以通過nls_session_parameters檢視檢視到這個內容

SQL> select * from nls_session_parameters;

 

PARAMETER                                      VALUE

--------------------------------------------- -------------------------

NLS_LANGUAGE                                        AMERICAN

NLS_TERRITORY                                        AMERICA

NLS_CURRENCY                                         $

NLS_ISO_CURRENCY                                AMERICA

NLS_NUMERIC_CHARACTERS                                  .,

NLS_CALENDAR                                         GREGORIAN

NLS_DATE_FORMAT                                DD-MON-RR

NLS_DATE_LANGUAGE                            AMERICAN

NLS_SORT                                           BINARY

NLS_TIME_FORMAT                                HH.MI.SSXFF AM

NLS_TIMESTAMP_FORMAT                              DD-MON-RR HH.MI.SSXFF AM

 

PARAMETER                                      VALUE

--------------------------------------------- -------------------------

NLS_TIME_TZ_FORMAT                          HH.MI.SSXFF AM TZR

NLS_TIMESTAMP_TZ_FORMAT                     DD-MON-RR HH.MI.SSXFF AM

                                                     TZR

 

NLS_DUAL_CURRENCY                            $

NLS_COMP                                         BINARY

NLS_LENGTH_SEMANTICS                               BYTE

NLS_NCHAR_CONV_EXCP                                FALSE

 

session level的引數是影響最終我們看到NLS結果的控制因素。Session levelNLS引數來自客戶端配置。對Windows而言,就是我們登錄檔中關於NLS_LANG等一系列的環境變數。Unix/Linux而言,就是我們配置在.bash_profile檔案中定義的相應內容

 

7.      配置bash_profile檔案

 

[oracle@oracle ~]$ cat .bash_profile

export NLS_LANG=american_america.AL32UTF8

 

8.      重啟例項

 

9.      建立新表,帶中午內容

10.              查詢

SQL> select * from T_DEVICE;          

 

  DEVICEID     TYPEID DEVICENAME           DEVICEPOS

---------- ---------- -------------------- --------------------

DEVICEREGION             I      STATIONID

-------------------- - ----------

         2          2 雨監測1                 K1508+414

                        1              1

 

         4          2 雨監測2                 K1512+544

                        1              2

 

         6          2 雨監測2                 K1517+809

 

 

中文正確顯示

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26217983/viewspace-1578408/,如需轉載,請註明出處,否則將追究法律責任。

相關文章