因為我們公司的數據庫一直使用的是ZHT16BIG5字符集﹐很少注意utf8字符集。昨天聽朋友說在oracle數據庫中unicode字符集(其實unicode只是一種編碼規范﹐它也可分為多種字符集)中一個漢字占三個字節﹐而字母和數字是單字節。在oracle數據庫中utf8是unicode的一種。下面通過對utf8字符集的測試﹐發現一個漢字確實占三個字節。因此以后要注意的是﹐當我們把ZHT16BIG5字符集數據庫內的資料導到utf8字符集的數據庫內時﹐可能會遇到要增加欄位長度的問題﹐因為原本可以存放三個漢字的欄位現在只能存放兩個漢字。
關于unicode﹕
Unicode 因為使用兩個byte存放不同文字的編碼,所以可以支持多語言, 即以unicode存放的文字可以顯示成為不同的語言種類,例如: 簡體中文, 繁體中文, 日文, 韓文,等等.
每個語言中的字符在unicode中都有一定的編碼, 有一點需要注意, 我們就以簡體中文, 和繁體中文為例: 例如 ‘生’這個字, 在簡體中文, 繁體中文中都有, 但是因為簡體中文的”生”,和繁體中文的”生”,寫法一樣, 所以,在unicode 編碼中, “生”這個字的編碼只有一個, 如果寫法不一樣,在unicode 中就會有多個編碼.
測試﹕
SQL> select value$ from props$ where name='NLS_CHARACTERSET';
VALUE$
-------------------------------------------------------------------
UTF8
SQL> create table t (col1 varchar2(10));
已建立表格.
SQL> insert into t values('表') ;
已建立 1 個資料列.
SQL> insert into t values('表格');
已建立 1 個資料列.
SQL> insert into t values('表格表格');
insert into t values('表格表格')
*
ERROR 在行 1:
ORA-01401: 資料欄的插入值過大
SQL> insert into t values('表格表');
已建立 1 個資料列.
SQL> insert into t values('表格表 ');
已建立 1 個資料列.
SQL> select length(col1) from t;
LENGTH(COL1)
------------
1
2
3
4
SQL> select lengthb(col1) from t;
LENGTHB(COL1)
-------------
3
6
9
10
SQL>
當把ZHT16BIG5字符集內的資料導到utf8字符集時﹕
SQL> conn test/test@t7.3
Connected to Oracle9i Enterprise Edition Release 9.2.0.7.0
Connected as test
SQL> create table t(col varchar2(10));
Table created
SQL> insert into t values('表格表格');
1 row inserted
SQL> insert into t values('表格表格as');
1 row inserted
SQL> commit;
Commit complete
導出再導入﹕
C:Documents and SettingsAdministrator>exp test/test@t7.3 file=d:test.dmp
Export: Release 9.2.0.1.0 - Production on 星期四 10月 19 09:07:56 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
連線至: Oracle9i Enterprise Edition Release 9.2.0.7.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.7.0 - Production
已匯出 ZHT16MSWIN950 字元集和 AL16UTF16 NCHAR 字元集
伺服器使用 ZHT16BIG5 字元集 (可能的字元集轉換)
. 正在匯出預先綱要程序物件與動作
. 正在匯出使用者 TEST外來功能程式庫名稱
. 正在匯出 PUBLIC 類型同義字
. 正在匯出專用類型同義字
. 正在匯出使用者 TEST 物件類型的定義
即將匯出 TEST 的物件 ...
. 正在匯出資料庫連結
. 正在匯出順序號碼
. 正在匯出叢集定義
. 即將匯出 TEST 的表格 經由一般路徑 ...
. . 正在匯出表格 T匯出了 2 列
. 正在匯出同義字
. 正在匯出視觀表
. 正在匯出預存程序
. 正在匯出咚阕?br />. 正在匯出引用整合性限制條件
. 正在匯出觸發程式
. 正在匯出索引類型
. 正在匯出點陣圖, 函數與可擴充索引
. 正在匯出後期表格行動
. 匯出具體視觀表
. 正在匯出瞬間拷貝日誌
. 正在匯出工作佇列
. 正在匯出復新群組和子項
. 正在匯出維度
. 正在匯出後綱要程序物件與動作
. 正在匯出統計資料
匯出作業已在沒有警告的情況下順利終止.
C:Documents and SettingsAdministrator>imp test/test@t2.28 file=d:test.dmp
Import: Release 9.2.0.1.0 - Production on 星期四 10月 19 09:24:16 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
連線至: Oracle9i Enterprise Edition Release 9.2.0.7.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.7.0 - Production
經由傳統路徑, 由 EXPORT:V09.02.00 建立的匯出檔
已在 ZHT16MSWIN950 字元集與 AL16UTF16 NCHAR 字元集中完成了匯入
匯入伺服器使用 UTF8 字元集 (可能的字元集轉換)
. 正在將 TEST 的物件匯入 TEST 中
. . 正在匯入表格 "T"
IMP-00019: 資料列遭拒由於發生 ORACLE 錯誤 1401
IMP-00003: ORACLE 錯誤 1401 發生
ORA-01401: 資料欄的插入值過大
資料欄 1 表格表格
IMP-00019: 資料列遭拒由於發生 ORACLE 錯誤 1401
IMP-00003: ORACLE 錯誤 1401 發生
ORA-01401: 資料欄的插入值過大
資料欄 1 表格表格as匯入了 0 列
匯入作業順利終止, 但含有警告
C:Documents and SettingsAdministrator>
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/33600/viewspace-266409/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/33600/viewspace-266409/