在oracle中有三種比較經常使用的類型:varchar2(byte)、varchar2(char)、nvarchar2()。數據庫
那麼這三種類型到底有什麼區別呢?安全
首先,咱們要時刻記清:不管是varchar2仍是nvarchar2,最大字節數都是4000。oracle
varchar2(byte):就是默認的表示方式,好比咱們寫成: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個字節!教程
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)。
注:oracle 12c的varchar2也沒有4000的限制了