2011年10月18日 星期二

文字資料要用哪種資料型別儲存char, varchar, nchar, nvarchar

「字元」這件事情我們先要有一個觀念,就是中文字和英文字,每個字(中文是單字、英文是字母)所佔的位元是不同的。

image

英文一個字母,佔1個byte。廢話,當初系統的設計就是先做英文字母符號和0-9等國際通用符號。中文則因為1byte(共8碼)的二進位編碼根本不夠中國字使用,所以改成16碼二進位編碼,所以中文每個字比英文字母多佔一倍的儲存空間。
外國人使用習慣上直接把byte稱做是字元,因為1字元(1 個英文字母)就是1byte,byte其實是8個bit組成的二進位制編碼;在中國字可千萬不要稱為字元,而要稱為一個word…在國外定義1word=2byte…所以在建立資料庫資料表時,可千萬要算準來,比方說你限定一篇回應文章最多500字,這500字是「中國字」還是「英文字元」,如果是500字元的話,那麼其實就是250個中文字…

如果你還是不大懂bit、byte,建議看看下面的說明:
電腦的資料是使用二進位的0或1,每一個0或1是最小的儲存單位,也就是位元。
將8個位元組合成一個位元組(byte),我們通常將英語系或歐語系的字母、0~9的數字或符號等能夠使用一個位元組來表示的資料稱為字元(character) 
而中文字等需要使用兩個位元組(16位元)才能表示的資料則稱為字組(word)。

結論:
所以它們之間的關系為:
bit 可以代表0,1
1byte = 8 bits
1word = 2 bytes = 16bits
1doubleword = 2 words = 4bytes = 32bit

額外一提:其他國家的國字所佔用的位元數是多少我沒有研究
不過可以很確定的事,中文字佔的空間是英文字的二倍
所以買一些以英文為主的3c產品(例如手機),記憶體容量的部分進了台灣市場後會發現不太給力…

好啦,進入主題,在建立資料庫的時候,文字資料要用哪種資料型別儲存????

以SQL SERVER 2008提供的資料類型來看,我們可以有char, varchar, nchar, nvarchar來選擇。

◎字元字串
資料類型 範圍 儲存體
char [ ( n ) ] n 必須是 1 到 8,000 的值。 1字元=1位元組
varchar [ ( n | max ) ] 可變長度。n 可以是 1 - 8,000。max 表示最大是 2^31-1 位元組。 1字元=1位元組
text 可變長度非 Unicode 資料,最大是 2^31-1 (2,147,483,647) 個字元。 1字元=1位元組
◎Unicode 字元字串
資料類型 範圍 儲存體
nchar [ ( n ) ] n 字元的固定長度 Unicode 字元資料。n 必須是 1 到 4,000 的值。 1word =2位元組
nvarchar [ ( n | max ) ] 可變長度,Unicode 字元資料。n 可以是 1 到 4,000 的值。
max 表示最大儲存體大小是 2^31-1 位元組。
1word =2位元組
ntext 可變長度 Unicode 資料,最大長度為 2^30 - 1 (1,073,741,823) 個字元 1word =2位元組

現在我們綜合整理一下:

char和nchar的差別:

差一個「n」,就是你使用的是不是unicode編碼的字,如果你要設計跨國別/語言的平台,那麼用unicode最好,也許你有一個經驗,以前使用對岸軟體時,安裝完後一堆亂碼,這是因為發行軟體(gb編碼)和你的作業系統(big5編碼)不同,造成解譯上的錯誤…所以我建議加個「n」…用unicode國際語言統一編碼,雖然這個時候連英文字都變成了2byte,但可以保證的是一個碼就是對應一個符號,不會亂掉。

nchar和nvarchar的差別:

差一個「var」,是指你的資料表儲存空間,要使用固定長度,還是隨內容調整。舉例來說,如果我設分別在二個資料表設定資料類型為nchar(500)和nvarchar(500),輸入同樣的文字內容「我是大帥哥」,在nvarchar(500)裡頭就只佔了10byte=80bit的儲存空間;但在nchar(500)因為長度固定,會自動在「我是大帥哥」這些字後面自動加空格填滿(喔…空格可也是算一種編碼的),所以不管怎樣都是500byte=4000bit….

nchar 和 nvarchar 效能上,你覺得哪個比較好:這要看情況,在相同文字內容(100byte)下,nchar(500)和nvarchar(500)比較,你可以感覺到nvarchar相對節省空間,自然加快索引。但是如果那篇文字內容一直被修改的話…那麼因為儲存空間不像nchar那樣先被保留住某區塊,所以這個時候 nvarchar 反而因為儲存空間不連續導致讀取時的效能降低…所以長時間會修改的資料…用nchar反而較好。

另外一個支持nvarchar比較好的論點就是一般O/R Mapping中對應實體的屬性類型是string,所以可變長度的型別和mapping比較吻合。

text和ntext不常用的原因:

這和sql server 的「索引」技術有關,text 和 ntext 是不支援的
索引最大長度限制是900byte,這個索引就和我們在windows 7上搜尋某資料時,他都會建議你建立「索引」的功能一樣,目的是提昇你查資料的速度。所以我們設一些固定資料內容時,可以以900byte為限,如設nvarchar (900)。

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...
// Dnow Function