Oracle 漢字在不同字元集下所佔位元組

來源:互聯網
上載者:User

標籤:

今天發現了一個問題,一個長度設定為2000位元組的欄位,插入一條長度為1000的漢字資料,竟然報錯了。

一個漢字佔兩個位元組,按理說剛好是2000個位元組。但通過查看日誌,發現插入資料的長度為3000位元組。

百度了一下,原來是不同的字元集造成的。

一般情況下,資料庫的NLS_CHARACTERSET 為AL32UTF8或UTF8,即一個漢字佔用三到四個位元組。如果NLS_CHARACTERSET為ZHS16GBK,則一個字元佔用兩個位元組。

而公司的運行環境上是AL32UTF8,因此一個漢字佔到了3個位元組。

1. 使用lengthb方法查看當前資料庫中文字元的位元組數

可以看到當前資料庫漢字是佔了3個位元組。

2. varchar2類型:對於VARCHAR2字元要用幾個位元組儲存,要看資料庫使用的字元集,比如GBK,漢字就會佔兩個位元組,英文1個。如果是UTF-8,漢字一般佔3個位元組,英文還是1個。 所以,varchar2長度的定義,最多可達4000(可儲存4000個英文字元),但實際能儲存的長度,取決於字元集。

nvarchar2類型:對於NVARCHAR2字元,所有字元都會按照2個位元組進行儲存,因此最多隻能定義到2000的長度。同時,對於純英文的儲存,那麼就會多耗費一倍空間(因為英文在varchar2類型裡只要1個位元組的空間)。但對於漢字的儲存其實是更合適的,這樣能保證漢字儲存得最多(2000個)。

下面是一個例子:

首先分別建立兩個表,均只有一個欄位,tblvarchar2的欄位長度為20,類型為varchar2。tblnvarchar2的欄位長度為20,類型為nvarchar2。

然後插入長度為20的中文。

可見nvarchar2的長度確實為字元能插入的最大長度,與字元集本身無關。

查詢結果:

Oracle 漢字在不同字元集下所佔位元組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.