oracle中有三種比較常用的型別:varchar2(byte)、varchar2(char)、nvarchar2()。
那麼這三種型別到底有什麼區別呢?
首先,我們要時刻記清:無論是varchar2還是nvarchar2,最大位元組數都是
4000。
alter session set nls_length_semantics= byte | char;
varchar2(byte):就是預設的表示方式,比如我們寫成:varchar2(100),就相當於varchar2(100 byte),表示最大位元組數是100,該欄位最多能容納100個位元組,強調空間大小。
由於我們描述的是位元組,因此,儲存漢字等字元時,就要小心了。如果你的資料庫用的是gbk編碼,那麼乙個漢字將占用2個位元組,最多能存50個漢字,如果你的資料庫用的是utf8編碼,那麼乙個漢字將占用3個位元組,最多能存33個漢字。
varchar2(char):表示最大字元數是100,該欄位最多能容納100個字元,強調個數。假設我們寫成varchar2(100char),那麼無論是數字、字母、漢字,都看成乙個字元,最多寫100個,當然,漢字越多,占用的空間越大,同樣遵循上邊的資料庫編碼原則。例如:存入乙個漢字,底層佔2或3個位元組,存入乙個字母,佔1個位元組,絕對不是某些文章所說1個字母或數字也佔2或3個位元組!
nvarchar2():沒有byte、char之分,類似於varchar2(char),只不過nvarchar2()遮蔽了資料庫編碼,無論是何種編碼,nvarchar2()中乙個漢字都佔兩個位元組。
一般的教程,也就到這了,可是如果再多一步思考,會發現乙個致命問題。
實際應用中,很可能會出現這種寫法:varchar2(1400char),我們主觀的認為,這個字段最長不能超過1400個字元,這意味著我們可能會存入1399個字元,貌似很正確的樣子。
但是,如果這1399個字元都是漢字,字元長度並沒有超過1400,看起來一切正常,但實際上我們損失了一部分資料,為什麼?
因為1399個漢字,按utf8編碼來說(99%的專案都是utf8編碼吧。。),需要占用1399*3=4197個位元組,而文章開篇就說,無論是什麼char,最大長度就是4000位元組,乙個也不能多,因此多出來的197個位元組,都會抹去,而整個過程中,無任何錯誤提示,你的資料就這樣蒸發了!
所以,對於gbk編碼的資料庫而言,安全的寫法為:varchar2(2000 char)、nvarchar2(2000),對於utf8編碼的資料庫而言,安全的寫法為:varchar2(1333char)、nvarchar2(2000)。
Oracle中char和varchar2的區別
1.char的長度是固定的,而varchar2的長度是可以變化的,比如,儲存字串 abc 對於char 20 表示你儲存的字元將佔20個位元組 包括17個空字元 在資料庫中它是以空格佔位的,而同樣的varchar2 20 則只占用3個位元組的長度,20只是最大值,當你儲存的字元小於20時,按實際長度...
varchar和varchar2的區別
varchar是標準sql裡面的。varchar2是oracle提供的獨有的資料型別。varchar對於漢字佔兩個位元組,對於英文是乙個位元組,佔的記憶體小,varchar2都是佔兩個位元組。varchar對空串不處理,varchar2將空串當做null來處理。varchar存放固定長度的字串,最大...
varchar和varchar2還有char的區別
varchar,varchar2 聯絡 1.varchar varchar2用於儲存可變長度的字串 比如varchar 20 存入字串 abc 則資料庫中該字段只佔3個位元組,而不是20個位元組 2.size 的最大值是 4000,而最小值是 1,其值表示位元組數,比如 varchar 20 表示最...