2017-07-18 74 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))。

相关问题