2017-07-18 70 views
0

它是否佔用固定的N*2或者如果要存儲的實際值小於N*2字節,它可能使用較少的存儲空間?nvarchar(n)如何存儲在SQL Server中?

我有一個固定的nvarchar類型的許多領域的巨大表。有些是nvarchar(100)有的nvarchar(400)

數據列是從來沒有一個確切的尺寸,它變化從0N。大部分數據小於N/2

例如,名爲RecipientName的字段的類型爲nvarchar(400),並且有9026424行。

只有大小RecipientName將是800*9026424 = 6.72 GB

但整個表的實際存儲大小隻有2.02 GB。是否有任何壓縮應用或有些小於2的功率選擇?

+0

https://docs.microsoft.com/en-us/sql/t-sql/data-types/nchar-and-nvarchar-transact-sql – Siyual

+0

* Unicode *,UTF16具體。它每個字符至少使用兩個字節。它的長度*可變,所以這些字段不需要200或800字節,只需要什麼。對於ANSI –

+0

,固定長度類型是'nchar'和'char'它使用時佔用空間,如果第一行有10個字符,則需要10 X 2 = 20個字節。因此你可能會減少。另請檢查您是否在該表上設置了列存儲索引 –

回答

1

是,

它可能使用更少的存儲,如果要被存儲的實際值越小 然後N * 2個字節

Ñ只是示出了可以存儲的最大字符數在此字段中,存儲的字符數等於您傳入的實際字符數。

而這裏是文檔:nchar and nvarchar (Transact-SQL)

2

NCHAR數據類型:

  1. 它是一個固定長度數據類型。

  2. 它佔據爲每個字符的空間2字節

  3. 它是用來存儲Unicode字符(如其他語言,如西班牙語,法語,阿拉伯語,德語等)

例如:

Declare @Name NChar(20); 
Set @Name = N'Sachin' 
Select @Name As Name, DATALENGTH(@Name) As [Datalength In Bytes], LEN(@Name) As [Length]; 


Name Datalength Length 
Sachin 40   6 
  1. 即使聲明大小爲20,數據長度列顯示40個字節的存儲內存大小,因爲它爲每個字符使用2個字節。

  2. 這40個字節的內存與存儲的實際數據長度無關。

NVARCHAR數據類型:

  1. 它是一種可變長度數據類型。

  2. 它佔據爲每個字符的空間2字節

  3. 它是用來存儲Unicode字符(如其他語言,如西班牙語,法語,阿拉伯語,德語等)

例如:

Declare @Name NVarchar(20); 
Set @Name = N'Sachin' 
Select @Name As Name, DATALENGTH(@Name) As [Datalength], LEN(@Name) As [Length]; 


Name Datalength Length 
Sachin 12   6 
  1. 即使聲明的大小爲20,數據長度列顯示12個字節的存儲內存大小,因爲它爲每個字符使用2個字節。

  2. 而這12個字節的內存與聲明中的數據長度無關。

希望這是有益:)

0

對於非MAX,非XML串類型,即它們被聲明爲(即,括號內的值)的長度的最小的最大數量(以字節計)將被允許的字符。但是,實際的限制不是按字符計算的,而是按字節計算的。 CHARVARCHAR字符可以是1或2個字節,所以最小的是1,因此[VAR]CHAR(100)有100個字節的限制。 100個字節可以填充100個單字節字符或50個雙字節字符或任何不超過100個字節的組合。 NCHARNVARCHAR(存儲爲UTF-16 Little Endian)字符可以是2或4字節,所以最小值爲2,因此N[VAR]CHAR(100)的最大值爲200字節。這200個字節可以填充100個雙字節字符或50個四字節字符,或任何不超過200個字節的組合。

如果啓用行或數據壓縮(這是一個每索引設置),那麼實際使用的空間通常會更小。 NCHARNVARCHAR使用Unicode壓縮算法,這是有點複雜,因此不容易計算它會是什麼。我相信MAX類型不允許壓縮。

外那些技術性的,所述VAR和非VAR類型之間的差異僅僅是在VAR類型只佔用插入或更新每個單獨的值的空間,而非VAR類型是填充空白和始終佔據宣佈的空間量(這就是爲什麼幾乎總是使用VAR類型)。 MAX類型只是可變的(即沒有0​​或NCHAR(MAX))。

相關問題