Sql server nvarchar(n)如何存储在SQL Server中?

Sql server nvarchar(n)如何存储在SQL Server中?,sql-server,storage,Sql Server,Storage,它是否占用固定的N*2,或者如果要存储的实际值小于N*2字节,它可能会使用更少的存储空间 我有一个巨大的表,有许多固定nvarchar类型的字段。有些是nvarchar100,有些是nvarchar400等 列中的数据从来不是精确的大小,它从0到N不等。大多数数据小于N/2 例如,名为RecipientName的字段的类型为nvarchar400,共有9026424行 只有RecipientName的大小为800*9026424=6.72 GB 但整个表的实际存储大小只有2.02GB。是否应用了

它是否占用固定的N*2,或者如果要存储的实际值小于N*2字节,它可能会使用更少的存储空间

我有一个巨大的表,有许多固定nvarchar类型的字段。有些是nvarchar100,有些是nvarchar400等

列中的数据从来不是精确的大小,它从0到N不等。大多数数据小于N/2

例如,名为RecipientName的字段的类型为nvarchar400,共有9026424行

只有RecipientName的大小为800*9026424=6.72 GB

但整个表的实际存储大小只有2.02GB。是否应用了任何压缩或选择了比N更小的2次方?

如果要存储的实际值较小,则可能会占用较少的存储空间 然后N*2字节

n仅显示此字段中可存储的最大字符数,存储的字符数等于您传入的实际字符数

这是文档:

如果要存储的实际值较小,则可能会占用较少的存储空间 然后N*2字节

n仅显示此字段中可存储的最大字符数,存储的字符数等于您传入的实际字符数

以下是文档:

NCHAR数据类型:

它是一种固定长度的数据类型

每个字符占用2字节的空间

它用于存储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
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
尽管声明的大小是20,但数据长度列显示40字节的存储内存大小,因为它对每个字符使用2个字节

这40字节的内存与存储的数据的实际长度无关

NVARCHAR数据类型:

它是一种可变长度的数据类型

每个字符占用2字节的空间

它用于存储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
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
尽管声明的大小是20,但数据长度列显示12字节的存储内存大小,因为它对每个字符使用2个字节

这12字节的内存与声明中数据的长度无关

希望这有帮助:

NCHAR数据类型:

它是一种固定长度的数据类型

每个字符占用2字节的空间

它用于存储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
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
尽管声明的大小是20,但数据长度列显示40字节的存储内存大小,因为它对每个字符使用2个字节

这40字节的内存与存储的数据的实际长度无关

NVARCHAR数据类型:

它是一种可变长度的数据类型

每个字符占用2字节的空间

它用于存储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
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
尽管声明的大小是20,但数据长度列显示12字节的存储内存大小,因为它对每个字符使用2个字节

这12字节的内存与声明中数据的长度无关

希望这对您有所帮助:

对于非MAX、非XML字符串类型,它们声明为的长度,即括号内的值是允许的最小字节字符的最大数量。但是,实际限制不是按字符计算的,而是按字节计算的。CHAR和VARCHAR字符可以是1或2个字节,因此最小的是1,因此[VAR]CHAR100限制为100个字节。这100个字节可以由100个单字节字符、50个双字节字符或不超过100个字节的任何组合填充。存储为UTF-16小端字符的NCHAR和NVARCHAR可以是2或4个字节,因此最小的是2,因此N[VAR]CHAR100的限制为200个字节。这200个字节可以由100个双字节字符或50个四字节字符或不超过200个字节的任何组合填充

如果启用行或数据压缩,这是每个索引的设置,那么实际使用的空间通常会更少。NCHAR和NVARCHAR使用Unicode压缩算法,该算法有点复杂,因此不容易计算它将是什么。我相信MAX类型不允许压缩

除了这些技术细节之外,VAR和非VAR类型之间的区别只是VAR类型只占用插入或更新的每个单独值的空间,而非VAR类型是空白填充的,并且总是占用声明的空间量,这就是为什么人们几乎总是使用VAR类型的原因。MAX类型只是变量,即没有CHARMAX或NCHARMAX。

对于非MAX、非XML字符串类型,它们声明为的长度,即括号内的值是maxim um允许的最小字节字符数。但是,实际限制不是按字符计算的,而是按字节计算的。CHAR和VARCHAR字符可以是1或2个字节,因此最小的是1,因此[VAR]CHAR100限制为100个字节。这100个字节可以由100个单字节字符、50个双字节字符或不超过100个字节的任何组合填充。存储为UTF-16小端字符的NCHAR和NVARCHAR可以是2或4个字节,因此最小的是2,因此N[VAR]CHAR100的限制为200个字节。这200个字节可以由100个双字节字符或50个四字节字符或不超过200个字节的任何组合填充

如果启用行或数据压缩,这是每个索引的设置,那么实际使用的空间通常会更少。NCHAR和NVARCHAR使用Unicode压缩算法,该算法有点复杂,因此不容易计算它将是什么。我相信MAX类型不允许压缩


除了这些技术细节之外,VAR和非VAR类型之间的区别只是VAR类型只占用插入或更新的每个单独值的空间,而非VAR类型是空白填充的,并且总是占用声明的空间量,这就是为什么人们几乎总是使用VAR类型的原因。MAX类型只是变量,即没有CHARMAX或NCHARMAX。

特别是Unicode、UTF16。它每个字符至少使用两个字节。但是它的长度是可变的,所以字段不需要200或800字节,只需要所需的。固定长度类型为nchar,ANSIIt的char在使用时占用空间,如果第一行有10个字符,则需要10 X 2=20字节。因此,你最终可能会更少。还要检查是否在该表上设置了columnstore索引。要进行压缩,必须为每个表显式启用它。您可以在所有版本中使用压缩,从Express和Local DB到Enterprise with SQL Server 2016 SP1。特别是Unicode、UTF16。它每个字符至少使用两个字节。但是它的长度是可变的,所以字段不需要200或800字节,只需要所需的。固定长度类型为nchar,ANSIIt的char在使用时占用空间,如果第一行有10个字符,则需要10 X 2=20字节。因此,你最终可能会更少。还要检查是否在该表上设置了columnstore索引。要进行压缩,必须为每个表显式启用它。从Express和Local DB到Enterprise with SQL Server 2016 SP1,您可以在所有版本中使用压缩。实际上,每个字符至少有2个字节。英语字母表之外的许多Unicode字符占用2个字节以上。请参阅中的备注部分。实际上每个字符至少有2个字节。英语字母表之外的许多Unicode字符占用2个字节以上。请参阅中的备注部分。