selectname,value$fromsys.props$wherenamelike'NLS%';NAMEVALUE$----------------------------------------------------------------------NLS_LANGUAGEAMERICANNLS_TERRITORYAMERICANLS_CURRENCY$NLS_ISO_C" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

sqlldr 導入亂碼,Oracle客戶端字符集問題

系統(tǒng) 3241 0
1,查Oracle數(shù)據(jù)庫創(chuàng)建時候的字符集:
Oracle服務器端執(zhí)行

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.

確認數(shù)據(jù)庫創(chuàng)建的時候選擇的字符集是 UTF-8
.執(zhí)行sql :select userenv('language') from dual; 獲取oracle服務端字符集X

SQL> select userenv('language') from dual;

USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.UTF8


2.? 檢查執(zhí)行 sqlldr 的客戶端的 NLS_LANG 的設置
Oracle 客戶端執(zhí)行

[oracle@localhost hx]$ echo $NLS_LANG
AMERICAN_AMERICA.UTF8


3. 盡量讓以上3個步驟檢查出的字符集設置都一致,開始通過 sqlldr 導入文本,并檢查結果。


通常出現(xiàn)問題的原因,可分為三種:

1. 服務器指定字符集與客戶字符集不同,而與加載數(shù)據(jù)字符集一致。

解決方法:對于這種情況,只需要設置客戶端字符集與服務器端字符集一致就可以了

oracle10g UTF8編碼:AMERICAN_AMERICA.AL32UTF8

????? GBK編碼:SIMPLIFIED CHINESE_CHINA.ZHS16GBK

客戶端修改為中文是:在linux的終端上設置環(huán)境變量
1.LANG=zh_CN
2.NLS_LANG=zhs16gbk

2. 服務器指定字符集與客戶字符集相同,與加載數(shù)據(jù)字符集不一致。

解決方法:強制加載數(shù)據(jù)字符集與服務器端字符集一致。

3. 服務器指定字符集與客戶字符集不同,與輸入數(shù)據(jù)字符集不一致。

對于這種情況,目前為止都還沒有太好的解決方法。

其中有的時候可以嘗試通過 iconv -f utf-8 -t gbk filename
從原字符集 utf-8 轉換成 gbk


修改數(shù)據(jù)庫端字符集的方法:
  1.服務器端字符集的設置和修改:
1.1 創(chuàng)建數(shù)據(jù)庫的時候直接選擇正確的字符集(顯示漢字的字符集主要有ZHS16CGB231280,US7ASCII,WE8ISO8859P1,ZHS16GBK等)
1.2如果創(chuàng)建的時候沒有選擇字符集,那么字符集將使用默認的字符集.可以使用如下命令查看數(shù)據(jù)庫的字符集.用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 數(shù)據(jù)庫的字符集為' WE8ISO8859P1'。
可以用update 命令修改數(shù)據(jù)庫的字符集,但是注意:修改字符集可能會對原有數(shù)據(jù)造成破壞,修改之前一定要先備份數(shù)據(jù)庫.命令如下:
用戶sys 以sysdba的身份登錄oracle. 字串9
SQL>update props$ set value$=’ZHS16GBK’ where name=’NLS_CHARACTERSET’
如果客戶端的字符集和服務器端不相同,就必須修改字符集.否則不能正確的顯示漢字.一般建議修改客戶端的字符集.
1.3不同字符集數(shù)據(jù)庫之間的數(shù)據(jù)導入
a)重新安裝數(shù)據(jù)庫或者是用update命令修改字符集。
b)強行修改oracle數(shù)據(jù)庫當前字符集。以sysdba的身份登錄oracle
SQL > create database character set ZHS16GBK (注:這里的字符集為導出數(shù)據(jù)的字符集)
* create database character set ZHS16GBK
ERROR at line 1:
ORA-01031: insufficient privileges
不用理會這個錯誤,用imp 裝入數(shù)據(jù)。數(shù)據(jù)裝完后,重啟動oracle 數(shù)據(jù),select * from V$NLS_PARAMETERS 此時,你會發(fā)現(xiàn),數(shù)據(jù)庫字符集又回到原來的字符集。
c)用第三方工具繞開字符集。如powerbuild的pipeline,delphi的datadump,MS access的數(shù)據(jù)導入導出工具。

客戶端字符集1、 客戶端字符集含義
客戶端字符集定義了客戶端字符數(shù)據(jù)的編碼方式,任何發(fā)自或發(fā)往客戶端的字符數(shù)據(jù)均使用客戶端定義的字符集編碼,客戶端可以看作是能與數(shù)據(jù)庫直接連接的各種應用,例如sqlplus,exp/imp等。客戶端字符集是通過設置NLS_LANG參數(shù)來設定的。

2、NLS_LANG 參數(shù)格式
NLS_LANG= Language_ Territory. Client character se
Language: 顯示oracle消息、校驗、日期命名
Territory :指定默認日期、數(shù)字、貨幣等格式
Client character set :指定客戶端將使用的字符集
例如: NLS_LANG=AMERICAN_AMERICA.US7ASCII
AMERICAN是語言,AMERICA是地區(qū),US7ASCII是客戶端字符集
3、 客戶端字符集設置方法
1)UNIX 環(huán)境
$NLS_LANG=“simplified chinese”_china.zhs16gbk
$export NLS_LANG
編輯oracle用戶的.profile文件(或.bash_profile linux)
$ export NLS_LANG="SIMPLIFIED CHINESE"_CHINA.UTF8
2)Windows 環(huán)境
編輯注冊表
Regedit.exe?? HKEY_LOCAL_MACHINE---SOFTWARE---ORACLE—HOME0

在DOS名下執(zhí)行:

Set NLS_LANG=“simplified chinese”_china.zhs16gbk
4、 NLS 參數(shù)查詢
Oracle 提供若干NLS參數(shù)定制數(shù)據(jù)庫和用戶機以適應本地格式,例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER等,可以通過查詢以下數(shù)據(jù)字典或v$視圖查看。
NLS_DATABASE_PARAMETERS-- 顯示數(shù)據(jù)庫當前NLS參數(shù)取值,包括數(shù)據(jù)庫字符集取值
NLS_SESSION_PARAMETERS--? 顯示由NLS_LANG 設置的參數(shù),或經(jīng)過alter session 改變后的參數(shù)值(不包括由NLS_LANG 設置的客戶端字符集)
NLS_INSTANCE_PARAMETE-- 顯示由參數(shù)文件init.ora 定義的參數(shù)V$NLS_PARAMETERS--顯示數(shù)據(jù)庫當前NLS參數(shù)取值

sqlldr 導入亂碼,Oracle客戶端字符集問題

圖1-3 查詢NLS參數(shù)值

5、 修改NLS參數(shù)
使用下列方法可以修改NLS參數(shù)
(1)修改實例啟動時使用的初始化參數(shù)文件
(2)修改環(huán)境變量 NLS_LANG
(3)使用ALTER SESSION語句,在oracle會話中修改
(4)使用某些SQL函數(shù)
NLS 作用優(yōu)先級別:Sql function>alter session>環(huán)境變量或注冊表>參數(shù)文件>數(shù)據(jù)庫默認

SQL*Loader的字符集轉換

使用SQL*Loader向數(shù)據(jù)庫裝載數(shù)據(jù),有兩種轉換字符集的模式

常規(guī)路徑: 數(shù)據(jù)被轉換為 NLS_LANG 指定的會話字符集或者控制文件指定的字符集。

控制文件可以指定字符集

SQL*Loader control file:

LOAD DATA

CHARACTERSET UTF16

INFILE ulcase11.dat

REPLACE …

如果數(shù)據(jù)文件的字符集與NLS_LANG環(huán)境變量的字符集不一致,SQL*Loader以NLS_LANG指定的字符集編碼存入數(shù)據(jù)庫。

直接路徑: 數(shù)據(jù)使用客戶端指示被轉換.

這樣要求數(shù)據(jù)庫的字符集是數(shù)據(jù)文件字符集的超級,否則有可能出現(xiàn)亂碼。

亂碼問題及解決辦法

要在客戶端正確顯示ORACLE數(shù)據(jù)庫中的漢字信息,首先必須使客戶端的字符集與服務器端的字符集一致;其次是加載到ORACLE數(shù)據(jù)庫的數(shù)據(jù)字符集必須與服務器字符集一致。據(jù)此,漢字顯示亂碼的問題大致可以分為以下幾種情況:
1、客戶端字符集與服務器端字符集不同,服務器端字符集與加載數(shù)據(jù)字符集一致。

如:

以system用戶登錄,創(chuàng)建表,插入數(shù)據(jù)。

sqlldr 導入亂碼,Oracle客戶端字符集問題

圖1-4 亂碼問題-正確的客戶端字符集

sqlldr 導入亂碼,Oracle客戶端字符集問題

圖1-5 亂碼問題-不一致的客戶端字符集

這種情況是最常見的,只要把客戶端的字符集設置正確即可。具體解決方案:
第一步:查詢V$NLS_DATABASE_PARAMETERS得到服務端的字符集:
SQL>SELECT * FROM V$NLS_DATABASE_PARAMETERS WHERE PARAMETER=’ NLS_CHARACTERSET;
PARAMETER VALUE
-----------------------------------------------------
NLS_CHARACTERSET ZHS16GBK

第二步:根據(jù)服務端的字符集設定客戶端的字符集,設定方法參見客戶端的字符集的設定方式。以LINUX系統(tǒng)為例,可在當前用戶的.bash_profile文件中增加如下兩行:
NLS_LANG=SIMPLIFIED Chinese_CHINA.ZHS16GBK
export NLS_LANG
2、客戶端字符集與服務器端字符集相同,服務器端字符集與加載數(shù)據(jù)字符集不一致。這種情況一般發(fā)生在ORACLE版本升級或重新安裝數(shù)據(jù)庫時選擇了與原來數(shù)據(jù)庫不同的字符集,而恢復加載的備份數(shù)據(jù)仍是按原字符集卸出的場合。另一種情況是加載從其它使用不同字符集的ORACLE數(shù)據(jù)庫卸出的數(shù)據(jù)。在這兩種情況中,不管客戶端字符集與服務器端字符集是否一致都無法正確顯示漢字。如:

具體解決方案:
方案一:按服務端字符集的修改方法修改服務端字符集與加載數(shù)據(jù)字符集一致,然后導入數(shù)據(jù)。
方案二:利用數(shù)據(jù)格式轉儲,避開字符集帶來的問題。即先將加載數(shù)據(jù)倒入到與其字符集一致的數(shù)據(jù)庫中,然后再將數(shù)據(jù)要么按文本格式導出(數(shù)據(jù)量較小的情況下),要么通過第三方工具(如POWER BUILDER,ACCESS,F(xiàn)OXPRO等)倒出數(shù)據(jù),最后將倒出的數(shù)據(jù)導入到目標數(shù)據(jù)庫中。
3、客戶端字符集與服務器端字符集不同,服務端字符集與輸入數(shù)據(jù)字符集不同。這種情況是在客戶端字符集與服務器端字符集不一致時,從客戶端輸入了漢字信息。輸入的這些信息即便是把客戶端字符集更改正確,也無法顯示漢字。

如:

sqlldr 導入亂碼,Oracle客戶端字符集問題

圖1-6 亂碼問題—錯誤的客戶端字符集

sqlldr 導入亂碼,Oracle客戶端字符集問題

圖1-7 亂碼問題—正確的客戶端字符集

?

解決方案:修改客戶端字符集與服務端字符集一致后,重新輸入數(shù)據(jù)。




sqlldr 導入亂碼,Oracle客戶端字符集問題


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 涩涩免费视频 | 亚洲视屏在线观看 | 视频一区二区国产无限在线观看 | 国产精品久久久久三级 | 欧洲亚洲精品 | 欧美大香a蕉免费 | 日本一级黄色录像 | 特级毛片免费视频播放 | 99成人精品 | 国产 欧美 在线 | 正在播放亚洲 | 一级成人毛片免费观看欧美 | xxxxyoujizz护士 | 久久亚洲欧美成人精品 | 99热国产在线 | 日韩免费一区二区三区 | 91视频播放 | 久久夜色精品国产噜噜小说 | 国产精品视频一区二区猎奇 | 全黄大全大色全免费大片 | 成人精品一区二区三区中文字幕 | 一区在线看| 狠狠88综合久久久久综合网 | 天天操天天干天天做 | 久久久久九九 | 国产在线观看91精品一区 | 国产成人福利夜色影视 | 亚洲性色视频 | 日日草夜夜草 | 久久99久久99小草精品免视看 | 亚洲欧美第一 | 草草免费观看视频在线 | 四虎在线最新永久免费播放 | 香蕉久人久人青草青草 | 国产一区二区三区高清 | 天天插天天舔 | a在线观看免费视频 | 四虎免费在线 | 香蕉爱爱网 | 日韩欧美亚 | 欧美激情免费 |