oracle 數據類型varchar2(byte)和varchar2(char)和nvarchar2()區別

無論是varchar2還是nvarchar2,最大字節數都是4000。

varchar2(byte) 存儲的是字節。

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

比如:varchar2(2 byte) 最多可以存儲2個字節;varchar2(2 char) 最多可以存儲2個字符。

這跟數據庫中的一個參數有關: NLS_LENGTH_SEMANTICS

select name,value from v$parameter where name='nls_length_semantics';

NAME                           VALUE
------------------------------ ------------------------------
nls_length_semantics BYTE
————————————————

varchar2(char) 存儲的是字符。

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

當數據庫字符集爲 AL32UTF8 時,一個漢字是一個字符,一個漢字佔3個字節,varchar2(2 byte) 一個漢字也不能存,varchar2(2 char) 能存2個漢字。

當數據庫字符集爲 ZHS16GBK時,一個漢字是一個字符,一個漢字佔2個字節,varchar2(2 byte) 能存1個漢字,varchar2(2 char) 能存2個漢字。

nvarchar2():沒有byte、char之分,類似於varchar2(char),只不過nvarchar2()屏蔽了數據庫編碼,無論是何種編碼,nvarchar2()中一個漢字都佔兩個字節。

  實際應用中,很可能會出現這種寫法:varchar2(1400 char),我們主觀的認爲,這個字段最長不能超過1400個字符,這意味着我們可能會存入1399個字符,貌似很正確的樣子。

         但是,如果這1399個字符都是漢字,字符長度並沒有超過1400,看起來一切正常,但實際上我們損失了一部分數據,爲什麼?

         因爲1399個漢字,按UTF8編碼來說(99%的項目都是UTF8編碼吧。。),需要佔用1399*3=4197個字節,而文章開篇就說,無論是什麼char,最大長度就是4000字節,一個也不能多,因此多出來的197個字節,都會抹去,而整個過程中,無任何錯誤提示,你的數據就這樣蒸發了!

         所以,對於GBK編碼的數據庫而言,安全的寫法爲:varchar2(2000 char)、nvarchar2(2000),對於UTF8編碼的數據庫而言,安全的寫法爲:varchar2(1333 char)、nvarchar2(2000)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章