Oracle 漢字在不同字符集下所占字節


今天發現了一個問題,一個長度設置為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的長度確實為字符能插入的最大長度,與字符集本身無關。

查詢結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM