◎字元字串 | ||
資料類型 | 範圍 | 儲存體 |
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)。