|
一.引言 ??? ORACLE數據庫字符集,即Oracle全球化支持(Globalization Support),或即國家語言支持(NLS)其作用是用本國語言和格式來存儲、處理和檢索數據。利用全球化支持,ORACLE為用戶提供自己熟悉的數據庫母語環境,諸如日期格式、數字格式和存儲序列等。Oracle可以支持多種語言及字符集,其中oracle8i支持48種語言、76個國家地域、229種字符集,而oracle9i則支持57種語言、88個國家地域、235種字符集。由于oracle字符集種類多,且在存儲、檢索、遷移oracle數據時多個環節與字符集的設置密切相關,因此在實際的應用中,數據庫開發和管理人員經常會遇到有關oracle字符集方面的問題。本文通過以下幾個方面闡述,對oracle字符集做簡要分析 二.字符集基本知識
2.1字符集
2.2字符編碼方案
2.3 字符集超級
2.4 數據庫字符集(oracle服務器端字符集)
2.5 客戶端字符集(NLS_LANG參數)
三.導入/導出與字符集轉換
3.1 EXP/IMP
EXP
IMP?
??? 四個字符集是
3.2導出的轉換過程
3.3導入的轉換過程
四.亂碼問題 ??? oracle在數據存儲、遷移過程中經常發生字符亂碼問題,歸根到底是由于字符集使用不當引起。下面以使用客戶端sqlplus向數據庫插入數據和導入/導出(EXP/IMP)過程為例,說明亂碼產生的原因。
4.1使用客戶端sqlplus向數據庫存儲數據
4.2發生亂碼原因
?
4.3導入/導出過程出現亂碼原因
五.單字節編碼存儲中文問題
???
由于歷史的原因,早期的oracle沒有中文字符集(如oracle6、oracle7、oracle7.1),但有的用戶從那時起就使用數據庫了,并用US7ASCII字符集存儲了中文,或是有的用戶在創建數據庫時,不考慮清楚,隨意選擇一個默認的字符集,如WE8ISO8859P1或US7ASCII,而這兩個字符集都沒有漢字編碼,雖然有些時候選用這種字符集好象也能正常使用,但用這種字符集存儲漢字信息從原則上說就是錯誤的,它會給數據庫的使用與維護帶來一系列的麻煩。
六.結束語 ??? 為了避免在數據庫遷移過程中由于字符集不同導致的數據損失,oracle提供了字符集掃描工具(character set scanner),通過這個工具我們可以測試在數據遷移過程中由于字符集轉換可能帶來的問題,然后根據測試結果,確定數據遷移過程中最佳字符集解決方案。
|
表格部分代碼如下:
<table id="testTbl" border=1>
<tr id="tr1">
<td width=6%><input type=checkbox id="box1"></td>
<td id="b">第一行</td>
</tr>
<tr id="tr2">
<td width=6%><input type=checkbox id="box2"></td>
<td id="b">第二行</td>
</tr>
<tr>
<td width=6%><input type=checkbox id="box3"></td>
<td>第三行</td>
</tr>
</table>
動態添加表行的javascript函數如下:
<script language="javascript">
function addRow(){
//添加一行
var newTr = testTbl.insertRow();
//設置行背景
newTr.bgColor = '#008040';
//添加兩列
var newTd0 = newTr.insertCell();
var newTd1 = newTr.insertCell();
//設置列內容和屬性
newTd0.innerHTML = '<input type=checkbox id="box4">';
newTd1.innerText= '新增加的行';
}
</script>
<BR>
<a href="#" onclick="addRow();">增加一行</a>
就這么簡單,做點詳細的說明:
1、inserRow()和insertCell()函數
insertRow()函數可以帶參數,形式如下:
insertRow(index)
這個函數將新行添加到index的那一行前,比如insertRow(0),是將新行添加到第一行之前。默認的insertRow()函數相當于insertRow(-1),將新行添加到表的最后。
insertCell()和insertRow的用法相同。
2、動態設置屬性和事件
上面行數中的innerHTML和innerText都是列的屬性。
這個inner,就是“inner”到<tb></tb>之間,innerText是添加到<tb></tb>之間的文本,innerHTML是添加到<tb></tb>之間的HTML代碼(這個so簡單,這個解釋挺多余的)
設置其他屬性也是用同樣的方式,比如,設置行背景色
newTr.bgColor = 'red';
?
設置事件也一樣,需要簡單說明一點。
比如,我要讓點擊新加行的時候執行一個自己定義的函數 newClick,newClick行數如下:
function newClick(){
alert("這是新添加的行");
}
對onclick事件設置這個函數的代碼如下:
newTr.onclick = newClick;
這里需要主義的是,=后面的部分必須是函數名,而且不能帶引號,
newTr.onclick = newClick();
newTr.onclick = 'newClick';
newTr.onclick = "newClick";
上面的寫法都是錯誤的。
為什么,其實知道為什么沒有什么意思,知道怎么用就OK了,如果不想知道,可以跳過下面這一段。
?
實際上這個=后面的newClick是指向自己定義的newClick函數的指針,javascript里面函數名就是指向函數的指針,加了引號括號什么的瀏覽器就找不到那個函數了。
下面的寫法,也是正確的
newTr.onclick = function newClick(){
alert("這是新添加的行");
}
這個使用函數名實際上是一樣的
設置其他的事件用法相同。