這3種字串資料型別是我們使用最多的,我們在資料庫設計時到底該怎麼使用了?
首先我們先來分析3個數據型別的說明:
1。char
CHAR的長度是固定的,最長2000個字元。
2。varchar 和 varchar2
可以肯定的是oracle中目前是可以使用varchar資料型別的,但他們的區別我查了不少資料也沒有找到一個準確的答案 最常見的說話是說oracle中的varchar只是varchar2的別名也就是同義詞。
其次也有人認為varchar是最大長度為2000的可變字串(和sql server中的varchar一致),而varchar2最大長度為4000。
知道了他們的特點我們就來討論下使用區別
1.char和varchar、varchar2
由於varchar和varchar2用途類似,我們先來討論char和他們的使用區別:
varchar和varchar2比char節省空間,在效率上比char會稍微差一些,即要想獲得效率,就必須犧牲一定的空間,這也就是我們在資料庫設計上常說的‘以空間換效率’。
varchar和varchar2雖然比char節省空間,但是如果一個varchar和varchar2列經常被修改,而且每次被修改的資料的長度不同,這會引起‘行遷移’(Row Migration)現象,而這造成多餘的I/O,是資料庫設計和調整中要盡力避免的,在這種情況下用char代替varchar和varchar2會更好一些。
當然還有一種情況就是象身份證這種長度幾乎不變的欄位可以考慮使用char,以獲得更高的效率。
2。varchar和varchar2
這裡就進入重點了,前面的區別我們在sql server中我們已經基本瞭解了,大家可能都知道,最多也就是複習下 ,但oracle增加了一個varchar2型別,是大家以前所沒有用到過的。
因為oracle保證在任何版本中該資料型別向上和向下相容,但不保證varchar,還有其他資料中一般都有varchar這個資料型別。
所以我得出了以下結論:
如果想在oracle新版本的資料庫相容就不要用varchar,如果想和oracle之外其他資料庫相容就不要用varchar2。
================================================= nvarchar 和 varchar 的區別是儲存方式不同
varchar是按位元組儲存的.而帶"n"的nvarchar是按字元儲存的
比如說 varchar(40),能儲存40個位元組長度的字元,儲存中文字元的時候,因為中文字元1個字元就等於2個位元組.所以varchar(40)只能儲存20箇中文字元.
nvarchar(40),就可以儲存40箇中文字元,也就是說可以儲存80個位元組長度的字元.nvarchar要相對於儲存的字元型別.比如有些字元是佔3個位元組的.
同樣的,char和nchar也一樣道理。
char是定長的,也就是當你輸入的字元小於你指定的數目時,char(8),你輸入的字元小於8時,它會再後面補空值。當你輸入的字元大於指定的數時,它會擷取超出的字元。 varchar是變長型,它的儲存空間會跟你輸入的實際字元數而改變,但最大長度不能超過你指定的長度。 nvarchar是unicode的變長型,它和char的區別很明顯了,它和varchar的區別主要是儲存空間大,相同長度下能容內更多的字元。
字符集是在安裝 SQL Server 時選擇的,不能更改。使用 Unicode 資料型別,列可儲存由 Unicode 標準定義的任何字元,包含由不同字符集定義的所有字元。Unicode 資料型別需要相當於非 Unicode 資料型別兩倍的儲存空間。 Unicode 資料使用 SQL Server 中的 nchar、varchar 和 ntext 資料型別進行儲存。對於儲存來源於多種字符集的字元的列,可採用這些資料型別。當列中各項所包含的 Unicode 字元數不同時(至多為 4000),使用 nvarchar 型別。當列中各項為同一固定長度時(至多為 4000 個 Unicode 字元),使用 nchar 型別。當列中任意項超過 4000 個 Unicode字元時,使用 ntext 型別。
nvarchar(n):
包含 n 個字元的可變長度 Unicode 字元資料。n 的值必須介於 1 與 4,000 之間。位元組的儲存大小是所輸入字元個數的兩倍。所輸入的資料字元長度可以為零。 varchar[(n)]:
長度為 n 個位元組的可變長度且非 Unicode 的字元資料。n 必須是一個介於 1 和 8,000 之間的數值。儲存大小為輸入資料的位元組的實際長度,而不是 n 個位元組。所輸入的資料字元長度可以為零。 1.
varchar[(n)]
長度為 n 個位元組的可變長度且非 Unicode 的字元資料。n 必須是一個介於 1 和 8,000 之間的數值。儲存大小為輸入資料的位元組的實際長度,而不是 n 個位元組。所輸入的資料字元長度可以為零。varchar 在 SQL-92 中的同義詞為 char varying 或 character varying。 nvarchar(n)
包含 n 個字元的可變長度 Unicode 字元資料。n 的值必須介於 1 與 4,000 之間。位元組的儲存大小是所輸入字元個數的兩倍。所輸入的資料字元長度可以為零。nvarchar 在 SQL-92 中的同義詞為 national char varying 和 national character varying。 n 表示字元個數 nvarchar:
不管是一個字元還是一個漢字,都存為2個位元組
varchar:
漢字是2個位元組,其他字元存為1個位元組 通俗一點就是varchar適合輸入英文和數字,nvarchar一般用做中文或其它語言的輸入,這樣到別的語系不會出現亂碼:)) 2.
N表示Unicode常量,可以解決多語言字符集之間的轉換問題,見聯機幫助 姓名,和房間通常都是用varchar這個資料型別 解釋一下:
drop proc a varchar(n):變長型字元資料型別,儲存最長長度為8,000 個字元。 舉個例子:
create table a (name1 varchar(8))
insert a select '張紅a'
--- 儲存長度為5個位元組,餘下的3個位元組全部釋放
insert a select '王一南'
----儲存長度為6個位元組,餘下的2個位元組全部釋放
---意思是varchar變長字元資料型別與儲存資料的實際長度是一致的 nvarchar(n):可變長度 Unicode 資料,其最大長度為 4,000 字元。
位元組的儲存大小是所輸入字元個數的兩倍,
就是說它是雙位元組來儲存資料的。
如果儲存資料如果存在單位元組時,它也是以雙位元組來佔用儲存空間的。 舉個例子:
create table aa (name1 nvarchar(8))
insert aa select '張紅a'
---儲存長度為6個位元組,餘下的2個位元組全部釋放