sqlldr 匯入亂碼 Oracle用戶端字元集問題

來源:互聯網
上載者:User

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的資料匯入匯出工具。
  • 1
  • 2
  • 下一頁

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.