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

