久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

字符集異常解決方案

 cinnamon 2011-10-07

問題一:不同字符集的數(shù)據(jù)庫間的數(shù)據(jù)遷移.

兩個數(shù)據(jù)庫字符集不一樣,現(xiàn)在要進(jìn)行數(shù)據(jù)遷移,,怎么辦?
01數(shù)據(jù)庫,,字符集為AMERICAN_AMERICA.AL32UTF8
02數(shù)據(jù)庫,字符集為AMERICAN_AMERICA.WE8ISO8859P1
現(xiàn)在要把01數(shù)據(jù)庫里面的數(shù)據(jù)遷移到02數(shù)據(jù)庫里面,,但字符集不一樣,,該怎么解決呢?,?,?

解決方案:
建議你02庫的字符集AL32UTF8一樣。不過你需要注意你客戶端的你字符集環(huán)境變量的設(shè)置,,一般設(shè)置成zhs16gbk為好,,如果設(shè)置成al32utf8有可能會顯示亂碼。

 

問題二: 數(shù)據(jù)庫服務(wù)器與客戶端的字符集都為us7ascII(只支持英文),但插入的是中文.正常顯示,但有隱患!

設(shè)置客戶端字符集為US7ASCII :
D:\>SET NLS_LANG=AMERICAN_AMERICA.US7ASCII
SQL> SELECT * FROM NLS_DATABASE_PARAMETERS;
PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET               US7ASCII

//由上可得,查看服務(wù)器字符集為US7ASCII

    建立測試表
SQL> CREATE TABLE TEST (R1 VARCHAR2(10));

Table created.

    插入數(shù)據(jù)
SQL> INSERT INTO TEST VALUES('東北');

1 row created.

SQL> SELECT * FROM TEST;

R1
----------
東北

SQL> EXIT


--------------------------------------------------------------------------------
這一部分的實驗數(shù)據(jù)的存取與顯示都正確,,好象沒什么問題,,但實際上卻隱藏著很大的隱患。
首先,,要將漢字存入數(shù)據(jù)庫,,而將數(shù)據(jù)庫字符集設(shè)置為US7ASCII是不合適的。US7ASCII字符集只定義了128個符號,,并不支持漢字,。另外,由于在SQL*PLUS中能夠輸入中文,,操作系統(tǒng)缺省應(yīng)該是支持中文的,,但在NLS_LANG中的字符集設(shè)置為US7ASCII,顯然也是不正確的,,它沒有反映客戶端的實際情況,。
但實際顯示卻是正確的,這主要是因為Oracle檢查數(shù)據(jù)庫與客戶端的字符集設(shè)置是同樣的,,那么數(shù)據(jù)在客戶與數(shù)據(jù)庫之間的存取過程中將不發(fā)生任何轉(zhuǎn)換,。具體地說,在客戶端輸入“東北”,,“東”的漢字的編碼為182(10110110),、171(10101011),,“北”漢字的編碼為177(10110001)、177(10110001),,它們將不做任何變化的存入數(shù)據(jù)庫中,,但是這實際上導(dǎo)致了數(shù)據(jù)庫標(biāo)識的字符集與實際存入的內(nèi)容是不相符的,從某種意義上講,,這也是一種不一致性,,也是一種錯誤。而在SELECT的過程中,,Oracle同樣檢查發(fā)現(xiàn)數(shù)據(jù)庫與客戶端的字符集設(shè)置是相同的,,所以它也將存入的內(nèi)容原封不動地傳送到客戶端,而客戶端操作系統(tǒng)識別出這是漢字編碼所以能夠正確顯示,。

在這個例子中,,數(shù)據(jù)庫與客戶端的設(shè)置都有問題,但卻好象起到了“負(fù)負(fù)得正”的效果,,從應(yīng)用的角度看倒好象沒問題,。但這里面卻存在著極大的隱患,比如在應(yīng)用length或substr等字符串函數(shù)時,,就可能得到意外的結(jié)果,。另外,如果遇到導(dǎo)入/導(dǎo)出(import /export)將會遇到更大的麻煩,。

 

問題三:服務(wù)器與客戶端是us7ascii,而插入中文后. 再修改客戶端為ZHS16GBK,無法正常顯示!

接著問題二的內(nèi)容與操作,然后:

更改客戶端字符集為ZHS16GBK
D:\>SET NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

D:\>SQLPLUS "/ AS SYSDBA"

無法正常顯示數(shù)據(jù)

SQL> SELECT * FROM TEST;

R1
--------------------
6+11

疑問1:ZHS16GBK為US7ASCII的超集,,為什么在ZHS16GBK環(huán)境下無法正常顯示
--------------------------------------------------------------------------------


這主要是因為Oracle檢查發(fā)現(xiàn)數(shù)據(jù)庫設(shè)置的字符集與客戶端配置字符集不同,它將對數(shù)據(jù)進(jìn)行字符集的轉(zhuǎn)換,。數(shù)據(jù)庫中實際存放的數(shù)據(jù)為182(10110110),、171(10101011)、177(10110001),、177(10110001),,由于數(shù)據(jù)庫字符集設(shè)置為US7ASCII,它是一個7bit的字符集,,存儲在8bit

的字節(jié)中,,則Oracle忽略各字節(jié)的最高bit,則182(10110110)就變成了54(0110110),,在ZHS16GBK中代表數(shù)字符號“6”(當(dāng)然在其它字符集中也是“6”),同樣過程也發(fā)生在其它3個字節(jié),,這樣“東北”就變成了“6+11”,。

 

問題四:服務(wù)器是us7ascii,客戶端字符集設(shè)置為ZHS16GBK,插入中文后.,造成信息丟失!!

接問題三繼續(xù)的.
SQL> INSERT INTO TEST VALUES('東北');

1 row created.

SQL> SELECT * FROM TEST;

R1
--------------------
6+11

SQL> EXIT
--------------------------------------------------------------------------------


當(dāng)客戶端字符集設(shè)置為ZHS16GBK后向數(shù)據(jù)庫插入“東北”,Oracle檢查發(fā)現(xiàn)數(shù)據(jù)庫設(shè)置的字符集為US7ASCII與客戶端不一致,,需要進(jìn)行轉(zhuǎn)換,,但字符集ZHS16GBK中的“東北”兩字在US7ASCII中沒有對應(yīng)的字符,,所以O(shè)racle用統(tǒng)一的“替換字符”插入數(shù)據(jù)庫,在這里為“,?”,,編碼為63(00111111),這時,,輸入的信息實際上已經(jīng)丟失,,不管字符集設(shè)置如何改變(如下面引用的實驗結(jié)果),第二行SELECT出來的結(jié)果也都是兩個“,?”號(注意是2個,,而不是4個)。

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多