utf8字符集中漢字默認占三個字節

因為我們公司的數據庫一直使用的是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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值