国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > Oracle > 正文

Oracle在數(shù)據(jù)轉(zhuǎn)儲(chǔ)時(shí)的字符集問(wèn)題

2024-08-29 13:39:53
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  作為一個(gè)Oracle數(shù)據(jù)庫(kù)的用戶,對(duì)于EXPort和Import兩個(gè)命令絕對(duì)不會(huì)感到生疏,因?yàn)檫@二者正是我們經(jīng)常用于數(shù)據(jù)備份和恢復(fù)的工具。但在使用這兩個(gè)命令過(guò)程中所發(fā)生的Oracle字符集問(wèn)題,常給一些Oracle使用者帶來(lái)不必要的麻煩和不必要的數(shù)據(jù)損失。本文將就Export和Import過(guò)程中Oracle字符集的轉(zhuǎn)換規(guī)律及使用這兩個(gè)命令的注重事項(xiàng)做一總結(jié)。
  字符集轉(zhuǎn)換的原因
  Oracle在數(shù)據(jù)轉(zhuǎn)儲(chǔ)時(shí)的字符集問(wèn)題
  Export、Import過(guò)程如上圖所示,從這個(gè)示意圖中可以看到有四處關(guān)系到字符集,而這四處字符集的不一致恰恰是導(dǎo)致Oracle進(jìn)行字符集轉(zhuǎn)換的原因。
  * 源數(shù)據(jù)庫(kù)字符集;
  * Export過(guò)程中用戶會(huì)話字符集;
  * Import過(guò)程中用戶會(huì)話字符集;
  * 目標(biāo)數(shù)據(jù)庫(kù)字符集。
  在Export和Import過(guò)程中,假如存在影響字符集轉(zhuǎn)換的四因素不一致,則可能發(fā)生Oracle字符集轉(zhuǎn)換,即:
  在Export過(guò)程中,假如源數(shù)據(jù)庫(kù)字符集與Export用戶會(huì)話字符集不一致,會(huì)發(fā)生字符集轉(zhuǎn)換,并在導(dǎo)出的二進(jìn)制格式Dmp文件的頭部幾個(gè)字節(jié)中存儲(chǔ)Export用戶會(huì)話字符集的ID號(hào)。在這個(gè)轉(zhuǎn)換過(guò)程中可能發(fā)生數(shù)據(jù)的丟失。
  例1: 假如源數(shù)據(jù)庫(kù)使用ZHS16GBK,而Export用戶會(huì)話字符集使用US7ASCII,由于ZHS16GBK是8位字符集,而US7ASCII是7位字符集,這個(gè)轉(zhuǎn)換過(guò)程中,中文字符在US7ASCII中不能夠找到對(duì)等的字符,所以所有中文字符都會(huì)丟失而變成“?? ”形式,即這種轉(zhuǎn)換后生成的Dmp文件已經(jīng)發(fā)生了數(shù)據(jù)丟失。
  例2: 假如源數(shù)據(jù)庫(kù)使用ZHS16GBK,而Export用戶會(huì)話字符集使用ZHS16CGB231280,但由于ZHS16GBK字符集是ZHS16CGB231280字符集的超集,這個(gè)過(guò)程中絕大部分字符都能夠正確轉(zhuǎn)換,只有一些超出ZHS16CGB231280字符集的字符變?yōu)椤?? ”形式。假如源數(shù)據(jù)庫(kù)使用ZHS16CGB231280字符集,而Export用戶會(huì)話使用ZHS16GBK字符集,則轉(zhuǎn)換過(guò)程能夠完全轉(zhuǎn)換成功。
  在Import向目標(biāo)數(shù)據(jù)庫(kù)轉(zhuǎn)換過(guò)程中,其字符集發(fā)生轉(zhuǎn)換的情況正好與Export過(guò)程相反,這里不再詳述。
  在Export導(dǎo)出的Dmp文件中,含有Export用戶會(huì)話字符集。在Import過(guò)程中,首先發(fā)生的是Dmp文件字符集(即Export用戶會(huì)話字符集)向Import用戶會(huì)話字符集的轉(zhuǎn)換。假如這個(gè)轉(zhuǎn)換過(guò)程不能正確完成,Import向目標(biāo)數(shù)據(jù)庫(kù)的導(dǎo)入過(guò)程也就不能完成。
  進(jìn)行字符集的正確轉(zhuǎn)換
  通常情況下,我們?cè)谑褂肙racle的Export和Import過(guò)程中,并不希望發(fā)生字符的轉(zhuǎn)換,但有時(shí)這種轉(zhuǎn)換卻是必要的。如我們?cè)诎惭bOracle數(shù)據(jù)庫(kù)時(shí),選擇ZHS16CGB231280字符集,由于這種字符集是一種中文小字符集,對(duì)于一些漢字不能夠正確表示,這需要通過(guò)使用ZHS16GBK字符集得到解決,此時(shí)就要進(jìn)行字符集的轉(zhuǎn)換。
  為了確保Export、Import過(guò)程中,Oracle字符集不發(fā)生轉(zhuǎn)換或正確轉(zhuǎn)換,建議最好在進(jìn)行這個(gè)過(guò)程前,檢查一下源數(shù)據(jù)庫(kù)字符集與Export用戶會(huì)話字符集是否一致,源數(shù)據(jù)庫(kù)字符集與目標(biāo)數(shù)據(jù)庫(kù)字符集是否一致,目標(biāo)數(shù)據(jù)庫(kù)字符與Import用戶會(huì)話字符集是否一致。假如能夠保證這四個(gè)字符集是一致的,則在Export、Import過(guò)程中,Oracle字符集就不用發(fā)生轉(zhuǎn)換。
  可用以下辦法檢查數(shù)據(jù)庫(kù)字符集:
  通過(guò)InitXXXX.ora文件進(jìn)行查看;
  借助SQL語(yǔ)句查看: SELECT NAME,VALUE$ FROM SYS.PROPS$ WHERE NAME=‘NLS_CHARACTERSET’。
  對(duì)于Export、Import用戶會(huì)話字符集,在Windows系統(tǒng)中也可以通過(guò)注冊(cè)表中的NLS_LANG進(jìn)行查看或修改,對(duì)于Unix系統(tǒng)則可通過(guò)設(shè)置用戶的環(huán)境變量NLS_LANG來(lái)查看或修改。
  非凡要注重的是,Oracle數(shù)據(jù)庫(kù)字符集通常是在創(chuàng)建時(shí)確定,一旦存儲(chǔ)用戶數(shù)據(jù)后就不要再修改了,因?yàn)槠鋽?shù)據(jù)都是使用該字符集進(jìn)行存儲(chǔ)的,改換其他字符集之后,原有數(shù)據(jù)就不能夠正確表示了。但假如確實(shí)想進(jìn)行字符集改變,則可通過(guò)以下幾步來(lái)實(shí)現(xiàn):
  備份數(shù)據(jù)庫(kù)后刪除原數(shù)據(jù)(可物理備份,如使用Export,請(qǐng)注重確保字符集不發(fā)生轉(zhuǎn)換或數(shù)據(jù)無(wú)損失);
  使用Internal用戶更新sys.props$表中的字符集:
  Update sys.props$ set name=‘Dest.CharSet’ Where name=‘NLS_CHARACTERSET’; COMMIT;
  重啟數(shù)據(jù)庫(kù);
  恢復(fù)數(shù)據(jù)。
  下面字符集之間的轉(zhuǎn)換是可行的:
  字符集子集向字符集父集轉(zhuǎn)換是可行的,如ZHS16CGB231280向ZHS16GBK轉(zhuǎn)換;而字符集父類向字符集子集進(jìn)行轉(zhuǎn)換時(shí),會(huì)損失部分?jǐn)?shù)據(jù)。
  只包含英文字符數(shù)據(jù)的雙字節(jié)字符集也可向單字節(jié)字符集轉(zhuǎn)換,如ZHS16GBK(English Only)可以向US7ASCII正確轉(zhuǎn)換。
  編碼范圍相同的單字節(jié)字符集之間通常可以進(jìn)行相互轉(zhuǎn)換。

  請(qǐng)注重,這里所說(shuō)的沒(méi)有數(shù)據(jù)損失,是指一種字符集A轉(zhuǎn)換成另一種字符集B之后,可以再?gòu)淖址疊正確轉(zhuǎn)換成字符集A或字符集B能夠正確表示字符集A中轉(zhuǎn)換過(guò)來(lái)的數(shù)據(jù)。
  字符集對(duì)程序的影響
  根據(jù)一個(gè)字符需要多少位字節(jié)來(lái)表示,可以把字符集分為單字節(jié)字符集和多字節(jié)字符集。其中,單字節(jié)字符集又分為7位字符集和8位字符集。單字節(jié)7位編碼字符集有US7ASCⅡ,單字節(jié)8位編碼字符集有符合ISO 8859-1標(biāo)準(zhǔn)規(guī)定的WE8ISO8859P1等。多字節(jié)編碼又分為固定長(zhǎng)度(長(zhǎng)度大于或等于2)編碼模式和不固定長(zhǎng)度編碼模式。多字節(jié)編碼字符集中的ZHS16GBK、ZHS16CGB231280、JA16SJIS等是采用兩個(gè)字節(jié)表示一個(gè)字符的字符集,又叫雙字節(jié)字符集。
  一個(gè)英文字母是一個(gè)字符,一個(gè)中文漢字是幾個(gè)字符呢?我們知道,一個(gè)中文漢字是雙字節(jié)字符,但它有幾個(gè)字符與其數(shù)據(jù)庫(kù)字符集有關(guān)。假如數(shù)據(jù)庫(kù)字符集使用單字節(jié)US7ASCII,則一個(gè)中文漢字是二個(gè)字符;假如數(shù)據(jù)庫(kù)字符集使用雙字節(jié)字符集ZHS16GBK,則一個(gè)中文漢字是一個(gè)字符。有關(guān)這一點(diǎn)可以使用Oracle的函數(shù)Substr得到證實(shí)。
  使用US7ASCⅡ字符集時(shí):
  Select substr(‘東北大學(xué)’,1,2) from dual;
  語(yǔ)句執(zhí)行結(jié)果返回‘東’。
  使用ZHS16GBK字符集時(shí):
  Select substr(‘東北大學(xué)’,1,2) from dual;
  語(yǔ)句執(zhí)行結(jié)果返回‘東北’。
  選擇合適的數(shù)據(jù)庫(kù)字符集
  選擇數(shù)據(jù)庫(kù)字符集時(shí)應(yīng)考慮以下事項(xiàng):
  1.?dāng)?shù)據(jù)庫(kù)需要支持什么語(yǔ)言
  在為數(shù)據(jù)庫(kù)選擇字符集時(shí),常會(huì)發(fā)現(xiàn)幾種字符集都適合你當(dāng)前語(yǔ)言需求,如簡(jiǎn)體中文就有ZHS16GBK和ZHSCGB231280等字符集可供選擇,應(yīng)選擇哪種?在選擇字符集時(shí),應(yīng)考慮到數(shù)據(jù)庫(kù)將來(lái)的系統(tǒng)需求。假如知道將來(lái)數(shù)據(jù)庫(kù)要擴(kuò)展支持不同的語(yǔ)言,選擇一個(gè)范圍較廣的字符集會(huì)是一個(gè)更好的主意。
  2.系統(tǒng)資源與應(yīng)用之間的互作用性
  選擇的數(shù)據(jù)庫(kù)字符集應(yīng)保證操作系統(tǒng)與應(yīng)用之間的無(wú)縫連接。假如選擇的字符集不是操作系統(tǒng)有效的字符集,則系統(tǒng)就需要在這兩者之間做字符轉(zhuǎn)換。在這種字符轉(zhuǎn)換過(guò)程中,就有可能發(fā)生一些字符丟失現(xiàn)象。從一種字符集A向另一種字符集B轉(zhuǎn)換過(guò)程中,A中的字符必須在B中可以找到等價(jià)的字符,否則就會(huì)以“?”來(lái)代替。從這個(gè)意義上說(shuō),假如兩種字符集編碼范圍是相同的,則可以相互轉(zhuǎn)換。
  字符集轉(zhuǎn)換過(guò)程中會(huì)影響系統(tǒng)性能,因此,應(yīng)保證客戶端和服務(wù)器端有相同的字符集以避免字符集轉(zhuǎn)換,也可以提高一定的系統(tǒng)性能。
  3.系統(tǒng)的性能要求
  不同的數(shù)據(jù)庫(kù)字符集對(duì)于數(shù)據(jù)庫(kù)的性能是有一定影響的。為了得到最好的數(shù)據(jù)庫(kù)性能,選擇的數(shù)據(jù)庫(kù)字符集應(yīng)避免字符轉(zhuǎn)換,并且要選擇對(duì)于期望的語(yǔ)言有最高效的編碼效率。通常,單字節(jié)字符集比多字節(jié)字符集有更優(yōu)的性能表現(xiàn),在空間需求方面也更小些。
  4.其他一些限制
  在為數(shù)據(jù)庫(kù)選擇一個(gè)合適的字符集時(shí),應(yīng)參考Oracle對(duì)應(yīng)版本的相關(guān)文檔,檢查Oracle對(duì)于一些字符集的限制。如Oracle 8.1.5版本中,以下字符集是不能使用的: JA16EUCFIXED、ZHS16GBKFIXED、JA16DBCSFIXED、KO16DBCSFIXED、ZHS16DBCSFIXED、JA16SJISFIXED、ZHT32TRISFIXED。
  綜上所述,正確理解Oracle字符集的轉(zhuǎn)換過(guò)程,可以使我們避免不必要的麻煩和數(shù)據(jù)損失。合理利用Oracle字符集的轉(zhuǎn)換過(guò)程,也可以幫助我們正確地從一種字符集轉(zhuǎn)換到另一種字符集,以滿足我們各種不同的應(yīng)用需求。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 珠海市| 凌源市| 龙陵县| 辽阳市| 手游| 丹棱县| 怀远县| 河北省| 广州市| 平乡县| 吉首市| 垣曲县| 犍为县| 梁河县| 克东县| 周口市| 安丘市| 大埔县| 田阳县| 郎溪县| 铁岭市| 金昌市| 深圳市| 洛浦县| 当雄县| 济宁市| 晋中市| 日土县| 阳曲县| 黔西| 洪泽县| 施甸县| 丽江市| 云林县| 恭城| 巴彦淖尔市| 宣汉县| 那坡县| 泰州市| 手游| 兴国县|