1,查Oracle資料庫建立時候的字元集:
Oracle伺服器端執行
SQL> select name, value$ from sys.props$ where name like 'NLS%';
NAME VALUE$
------------------------------ ----------------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET UTF8
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NAME 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 10.2.0.4.0
20 rows selected.
確認資料庫建立的時候選擇的字元集是 UTF-8
.執行sql :select userenv('language') from dual; 擷取oracle服務端字元集X
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.UTF8
2. 檢查執行 sqlldr 的用戶端的 NLS_LANG 的設定
Oracle 用戶端執行
[oracle@localhost hx]$ echo $NLS_LANG
AMERICAN_AMERICA.UTF8
3. 盡量讓以上3個步驟檢查出的字元集設定都一致,開始通過 sqlldr 匯入文本,並檢查結果。
通常出現問題的原因,可分為三種:
1. 伺服器指定字元集與客戶字元集不同,而與載入資料字元集一致。
解決方案:對於這種情況,只需要設定用戶端字元集與伺服器端字元集一致就可以了
oracle10g UTF8編碼:AMERICAN_AMERICA.AL32UTF8
GBK編碼:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
用戶端修改為中文是:在linux的終端上設定環境變數
1.LANG=zh_CN
2.NLS_LANG=zhs16gbk
2. 伺服器指定字元集與客戶字元集相同,與載入資料字元集不一致。
解決方案:強制載入資料字元集與伺服器端字元集一致。
3. 伺服器指定字元集與客戶字元集不同,與輸入資料字元集不一致。
對於這種情況,目前為止都還沒有太好的解決方案。
其中有的時候可以嘗試通過 iconv -f utf-8 -t gbk filename
從原字元集 utf-8 轉換成 gbk
修改資料庫端字元集的方法:
1.伺服器端字元集的設定和修改:
1.1 建立資料庫的時候直接選擇正確的字元集(顯示漢字的字元集主要有ZHS16CGB231280,US7ASCII,WE8ISO8859P1,ZHS16GBK等)
1.2如果建立的時候沒有選擇字元集,那麼字元集將使用預設的字元集.可以使用如下命令查看資料庫的字元集.用oracle的合法使用者登入.select * from V$NLS_PARAMETERS.
SQL > select * from V$NLS_PARAMETERS
parameter value
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
…. ….
NLS_CHARACTERSET WE8ISO8859P1
NLS_SORT BINARY
NLS_NCHAR_CHARACTERSET WE8ISO8859P1
---- 從上述資訊看出ORACLE 資料庫的字元集為' WE8ISO8859P1'。
可以用update 命令修改資料庫的字元集,但是注意:修改字元集可能會對原有資料造成破壞,修改之前一定要先備份資料庫.命令如下:
使用者sys 以sysdba的身份登入oracle. 字串9
SQL>update props$ set value$=’ZHS16GBK’ where name=’NLS_CHARACTERSET’
如果用戶端的字元集和伺服器端不相同,就必須修改字元集.否則不能正確的顯示漢字.一般建議修改用戶端的字元集.
1.3不同字元集資料庫之間的資料匯入
a)重新安裝資料庫或者是用update命令修改字元集。
b)強行修改oracle資料庫當前字元集。以sysdba的身份登入oracle
SQL > create database character set ZHS16GBK (註:這裡的字元集為匯出資料的字元集)
* create database character set ZHS16GBK
ERROR at line 1:
ORA-01031: insufficient privileges
不用理會這個錯誤,用imp 裝入資料。資料裝完後,重啟動oracle 資料,select * from V$NLS_PARAMETERS 此時,你會發現,資料庫字元集又回到原來的字元集。
c)用第三方工具繞開字元集。如powerbuild的pipeline,delphi的datadump,MS access的資料匯入匯出工具。