一次ORACLE字元轉換分析過程

yingyifeng306發表於2021-05-06

 

在aix資料庫上建立如下表時,varchar2欄位型別變成了varchar2( char);

                                             

 

 

varchar2( char) 的區別

      varchar2(byte)/varchar2() :就是預設的表示方式,比如我們寫成:varchar2(100),就相當於varchar2(100 byte),表示最大位元組數是100,該欄位最多能容納100個位元組,強調空間大小。由於我們描述的是位元組,因此,儲存漢字等字元時,就要小心了。如果你的資料庫用的是GBK編碼,那麼一個漢字將佔用2個位元組,最多能存50個漢字,如果你的資料庫用的是UTF8編碼,那麼一個漢字將佔用3個位元組,最多能存33個漢字。

 

     varchar2(char) :表示最大字元數是100,該欄位最多能容納100個字元,強調個數。假設我們寫成varchar2(100 char),那麼無論是數字、字母、漢字,都看成一個字元,最多寫100個,當然,漢字越多,佔用的空間越大,同樣遵循上邊的資料庫編碼原則。例如:存入一個漢字,底層佔2或3個位元組,存入一個字母,佔1個位元組,絕對不是某些文章所說1個字母或數字也佔2或3個位元組!

 

varchar2() 和varchar2() 的字元數量最大都是4000,即varchar2(4000)和varchar2(4000)是一樣的,但是在其他情況下,比如varchar2(40 char) >= varchar2(40) ,如果從varchr2(40 cahr) 的表匯出資料到varchar2(40) 將可能導致匯入報錯:ORA-12899 欄位長度不夠。

 

 

導致該問題的原因是nls_length_semantics引數的設定。

set line 150
  col parameter for a40
  col value for a40
  select * from nls_database_parameters where   parameter=upper('nls_length_semantics');

 

實驗:

 

實驗新建使用者troy,新建兩張表,test1在nls_length_semantic=char情況下建立,test6在nls_length_semantic=byte情況下建立。

實驗情況如下:

 

nls_length_semantics 為char的情況:

 

nls_length_semantics 為byte的情況:

 

從dbms包取出來的建表語句也可反映出這種差別;

 

 

 

查詢實驗

 

下面的實驗為補充實驗,分別在nls_length_semantic=char 和nls_length_semantic=byte的情況下,在plsql中查詢對應表的建表語句:

##test1 是在char的時候建立,test6是在 byte的情況下建立:

這個比較有意思:

 

4.2.1 使用dbms 包查詢:

在nls_length_semantic=char 和nls_length_semantic=byte 的情況是一樣的,如下圖:

 

4.2.2 使用右鍵檢視建立sql 的方式

在nls_length_semantic=byte的情況下

 

 

 

在nls_length_semantic=char的情況下:有了varchar2(byte)這個型別

 

 

1 建議linux資料庫nls_length_semantic變數和aix資料庫保持一致。畢竟aix生產庫已經有大量資料。更改較為麻煩;命令如下:

alter system set nls_length_semantic=char;

shutdown immediate;

startup;

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23732248/viewspace-2770886/,如需轉載,請註明出處,否則將追究法律責任。

相關文章