Oracle數據庫的varchar2(2)存儲一個漢字時提示插入漢字過長問題

      昨天在oracle實驗課上出現瞭如題所示的問題:varchar2(2)在存儲一個漢字時,提示插入漢字過長,要把它改成3才能存儲1個漢字。於是百度google之。

      先做以下實驗:

      建一個簡單的表var,只有一列name,數據類型爲varchar2(6),並向表中插入一條數據。

create table var (name varchar2(6));
insert into var values('測試');

      查詢插入的數據,並且同時查看name列的字符長度和字節長度。結果如下圖:

select u.name, length(u.name), lengthb(u.name)
from var u;

        從結果中可以看出,一個漢字佔了三個字節,而不是兩個,這跟字符集有關。

        查看字符集的代碼和結果如下:

select userenv('language') from dual;

          結果顯示,本機Oracle的字符集是UTF-8,32位,而不是GBK的16位。UTF-8的每個字符佔3個字節(bytes),可以通過修改默認字符集來實現varchar2(2)存儲一個漢字。方法如下:

SHUTDOWN IMMEDIATE;  
STARTUP MOUNT; 
ALTER SYSTEM ENABLE RESTRICTED SESSION; 
 ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; 
ALTER DATABASE OPEN; 
ALTER DATABASE CHARACTER SET AL32UTF8/ZHS16GBK;
SHUTDOWN IMMEDIATE;

STARTUP;

     主要參考資料:http://dev.tot.name/db/html/20090322/20090322131055.htm
附:

ORACLE nvarchar2和varchar2的區別

   1、NVARCHAR2中存儲中文字時,一箇中文字當一個字符來處理
      NVARCHAR2(10)是可以存進去10個漢字的,如果用來存英文也只能存10個字符。
   2、而VARCHAR2中一箇中文字當兩個字符來處理
      VARCHAR2(10)的話,則只能存進5個漢字,英文則可以存10個

     Oracle中nvarchar2和varchar2的共同點:
     不定長存儲,當存儲信息長度小於指定的長度,那麼就已實際存入的長度爲準這一點不像varchar這種定長存儲那樣浪費空間,比如varchar 指定是10個字符,那麼存入5個字符的時候,他會自動填充空格來補齊以達到指定的長度



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章