1. 程式人生 > >Oracle資料庫的varchar2(2)儲存一個漢字時提示插入漢字過長問題

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;

附:

ORACLE nvarchar2和varchar2的區別

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

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