sqlldr 导入乱码,Oracle客户端字符集问题
生活随笔
收集整理的這篇文章主要介紹了
sqlldr 导入乱码,Oracle客户端字符集问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
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、 客戶端字符集含義 客戶端字符集定義了客戶端字符數據的編碼方式,任何發自或發往客戶端的字符數據均使用客戶端定義的字符集編碼,客戶端可以看作是能與數據庫直接連接的各種應用,例如sqlplus,exp/imp等。客戶端字符集是通過設置NLS_LANG參數來設定的。 2、NLS_LANG 參數格式 NLS_LANG= Language_ Territory. Client character se Language: 顯示oracle消息、校驗、日期命名 Territory :指定默認日期、數字、貨幣等格式 Client character set :指定客戶端將使用的字符集 例如: NLS_LANG=AMERICAN_AMERICA.US7ASCII AMERICAN是語言,AMERICA是地區,US7ASCII是客戶端字符集 3、 客戶端字符集設置方法 1)UNIX 環境 $NLS_LANG=“simplified chinese”_china.zhs16gbk $export NLS_LANG 編輯oracle用戶的.profile文件(或.bash_profile linux) $ export NLS_LANG="SIMPLIFIED CHINESE"_CHINA.UTF8 2)Windows 環境 編輯注冊表 Regedit.exe HKEY_LOCAL_MACHINE---SOFTWARE---ORACLE—HOME0 在DOS名下執行: Set NLS_LANG=“simplified chinese”_china.zhs16gbk 4、 NLS 參數查詢 Oracle 提供若干NLS參數定制數據庫和用戶機以適應本地格式,例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER等,可以通過查詢以下數據字典或v$視圖查看。 NLS_DATABASE_PARAMETERS-- 顯示數據庫當前NLS參數取值,包括數據庫字符集取值 NLS_SESSION_PARAMETERS-- 顯示由NLS_LANG 設置的參數,或經過alter session 改變后的參數值(不包括由NLS_LANG 設置的客戶端字符集) NLS_INSTANCE_PARAMETE-- 顯示由參數文件init.ora 定義的參數V$NLS_PARAMETERS--顯示數據庫當前NLS參數取值 圖1-3 查詢NLS參數值 5、 修改NLS參數 使用下列方法可以修改NLS參數 (1)修改實例啟動時使用的初始化參數文件 (2)修改環境變量 NLS_LANG (3)使用ALTER SESSION語句,在oracle會話中修改 (4)使用某些SQL函數 NLS 作用優先級別:Sql function>alter session>環境變量或注冊表>參數文件>數據庫默認 SQL*Loader的字符集轉換 使用SQL*Loader向數據庫裝載數據,有兩種轉換字符集的模式 常規路徑: 數據被轉換為 NLS_LANG 指定的會話字符集或者控制文件指定的字符集。 控制文件可以指定字符集 SQL*Loader control file: LOAD DATA CHARACTERSET UTF16 INFILE ulcase11.dat REPLACE … 如果數據文件的字符集與NLS_LANG環境變量的字符集不一致,SQL*Loader以NLS_LANG指定的字符集編碼存入數據庫。 直接路徑: 數據使用客戶端指示被轉換. 這樣要求數據庫的字符集是數據文件字符集的超級,否則有可能出現亂碼。 亂碼問題及解決辦法 要在客戶端正確顯示ORACLE數據庫中的漢字信息,首先必須使客戶端的字符集與服務器端的字符集一致;其次是加載到ORACLE數據庫的數據字符集必須與服務器字符集一致。據此,漢字顯示亂碼的問題大致可以分為以下幾種情況: 1、客戶端字符集與服務器端字符集不同,服務器端字符集與加載數據字符集一致。 如: 以system用戶登錄,創建表,插入數據。 圖1-4 亂碼問題-正確的客戶端字符集 圖1-5 亂碼問題-不一致的客戶端字符集 這種情況是最常見的,只要把客戶端的字符集設置正確即可。具體解決方案: 第一步:查詢V$NLS_DATABASE_PARAMETERS得到服務端的字符集: SQL>SELECT * FROM V$NLS_DATABASE_PARAMETERS WHERE PARAMETER=’ NLS_CHARACTERSET; PARAMETER VALUE ----------------------------------------------------- NLS_CHARACTERSET ZHS16GBK 第二步:根據服務端的字符集設定客戶端的字符集,設定方法參見客戶端的字符集的設定方式。以LINUX系統為例,可在當前用戶的.bash_profile文件中增加如下兩行: NLS_LANG=SIMPLIFIED Chinese_CHINA.ZHS16GBK export NLS_LANG 2、客戶端字符集與服務器端字符集相同,服務器端字符集與加載數據字符集不一致。這種情況一般發生在ORACLE版本升級或重新安裝數據庫時選擇了與原來數據庫不同的字符集,而恢復加載的備份數據仍是按原字符集卸出的場合。另一種情況是加載從其它使用不同字符集的ORACLE數據庫卸出的數據。在這兩種情況中,不管客戶端字符集與服務器端字符集是否一致都無法正確顯示漢字。如: 具體解決方案: 方案一:按服務端字符集的修改方法修改服務端字符集與加載數據字符集一致,然后導入數據。 方案二:利用數據格式轉儲,避開字符集帶來的問題。即先將加載數據倒入到與其字符集一致的數據庫中,然后再將數據要么按文本格式導出(數據量較小的情況下),要么通過第三方工具(如POWER BUILDER,ACCESS,FOXPRO等)倒出數據,最后將倒出的數據導入到目標數據庫中。 3、客戶端字符集與服務器端字符集不同,服務端字符集與輸入數據字符集不同。這種情況是在客戶端字符集與服務器端字符集不一致時,從客戶端輸入了漢字信息。輸入的這些信息即便是把客戶端字符集更改正確,也無法顯示漢字。 如: 圖1-6 亂碼問題—錯誤的客戶端字符集 圖1-7 亂碼問題—正確的客戶端字符集 解決方案:修改客戶端字符集與服務端字符集一致后,重新輸入數據。轉載于:https://my.oschina.net/lxwgmail/blog/111128
總結
以上是生活随笔為你收集整理的sqlldr 导入乱码,Oracle客户端字符集问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DeDeCMS后台批量修改替换sql语句
- 下一篇: J2SE综合对java util的总结