天天看點

SQL中char、varchar、nvarchar的差別歸納

在進行SQL server 表結構設計時碰到問題,資料類型char、varchar與nvarchar有什麼差別?

經過查閱相關資料總結如下:

char

    char是定長的,也就是當你輸入的字元小于你指定的數目時,char(8),你輸入的字元小于8時,它會再後面補空值。當你輸入的字元大于指定的數時,它會截取超出的字元。

   nvarchar(n)

    包含 n 個字元的可變長度 Unicode 字元資料。n 的值必須介于 1 與 4,000 之間。位元組的存儲大小是所輸入字元個數的兩倍。所輸入的資料字元長度可以為零。      

varchar[(n)] 

    長度為 n 個位元組的可變長度且非 Unicode 的字元資料。n 必須是一個介于 1 和 8,000 之間的數值。存儲大小為輸入資料的位元組的實際長度,而不是 n 個位元組。所輸入的資料字元長度可以為零。

1、CHAR。CHAR存儲定長資料很友善,CHAR字段上的索引效率級高,比如定義char(10),那麼不論你存儲的資料是否達到了10個位元組,都要占去10個位元組的空間。 

 2、VARCHAR。存儲變長資料,但存儲效率沒有CHAR高。如果一個字段可能的值是不固定長度的,我們隻知道它不可能超過10個字元,把它定義為 VARCHAR(10)是最合算的。VARCHAR類型的實際長度是它的值的實際長度+1。為什麼“+1”呢?這一個位元組用于儲存實際使用了多大的長度。 

從空間上考慮,用varchar合适;從效率上考慮,用char合适,關鍵是根據實際情況找到權衡點。 

3、TEXT。text存儲可變長度的非Unicode資料,最大長度為2^31-1(2,147,483,647)個字元。 

4、NCHAR、NVARCHAR、NTEXT。這三種從名字上看比前面三種多了個“N”。它表示存儲的是Unicode資料類型的字元。我們知道字元中,英文字元隻需要一個位元組存儲就足夠了,但漢字衆多,需要兩個位元組存儲,英文與漢字同時存在時容易造成混亂,Unicode字元集就是為了解決字元集這種不相容的問題而産生的,它所有的字元都用兩個位元組表示,即英文字元也是用兩個位元組表示。nchar、nvarchar的長度是在1到4000之間。和char、varchar比較起來,nchar、nvarchar則最多存儲4000個字元,不論是英文還是漢字;而char、varchar最多能存儲8000個英文,4000個漢字。可以看出使用nchar、nvarchar資料類型時不用擔心輸入的字元是英文還是漢字,較為友善,但在存儲英文時數量上有些損失。 

是以一般來說,如果含有中文字元,用nchar/nvarchar,如果純英文和數字,用char/varchar。

幾點差別:

1.varchar:非Unicode 的字元資料;nvarchar: Unicode 資料。

2.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

3.一個漢字占varchar(2),隻占nvarchar(1),而字母隻占varchar(1),那麼在資料庫字段求長度的時候,用varchar你就不一定知道它确切的知道它到底有幾個字,如果用nvarchar,那麼漢字也是nvarchar(1),字母也是nvarchar(1),那麼已經很明顯了.

4.在性能上varchar的檢索快于nvarcha

另外varchar與char歸納幾點差別如下

Varchar 的類型不以空格填滿,比如varchar(100),但它的值隻是"qian",則它的值就是"qian"

而char 不一樣,比如char(100),它的值是"qian",而實際上它在資料庫中是"qian "(qian後共有96個空格,就是把它填滿為100個位元組)。

由于char是以固定長度的,是以它的速度會比varchar快得多!但程式處理起來要麻煩一點,要用trim之類的函數把兩邊的空格去掉! 是以有時候需要使用char的貯存空間以換得檢索速度的提高。但有時則要使用varchar擷取占用較低存儲空間。

繼續閱讀