nvarchar(n) 如何存储在 SQL 服务器中?

How is nvarchar(n) stored in SQL Server?

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

我有一个巨大的 table,其中包含许多固定 nvarchar 类型的字段。有些是 nvarchar(100),有些是 nvarchar(400)

列中的数据从来都不是精确大小,它从 0N 不等。大部分数据小于 N/2.

例如,名为RecipientName 的字段是nvarchar(400) 类型并且有9026424 行。

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

但整个 table 的实际存储大小仅为 2.02 GB。是否应用了任何压缩或选择了小于 2 次幂的 N?

是的,

it may use less storage if the actual value to be stored is smaller then N*2 bytes

n只是显示该字段最多可以存储的字符数,存储的字符数等于您实际传入的字符数。

这是文档:nchar and nvarchar (Transact-SQL)

NCHAR 数据类型:

  1. 这是一个固定长度的数据类型。

  2. 它占用 2 个字节 of space for EACH CHARACTER.

  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 个字节 of space for EACH CHARACTER.

  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字节的内存与声明中的数据长度无关

希望这对您有所帮助:)

对于非MAX、非XML的字符串类型,声明的长度(即括号内的值)是最小的最大数(以字节为单位) ) 将被允许的字符。但是,actual 限制不是根据字符计算的,而是根据字节计算的。 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 字节的组合来填充。

如果启用 ROW 或 DATA 压缩(这是每个 Index 设置),那么实际使用的 space 通常会更少。 NCHARNVARCHAR 使用 Unicode 压缩算法,该算法有些复杂,因此不容易计算出它是什么。而且我相信 MAX 类型不允许压缩。

除了这些技术细节之外,VAR 和非 VAR 类型之间的区别很简单,VAR 类型只占用每个人的 space值插入或更新,而非 VAR 类型被空白填充并且总是占用声明的数量 space (这就是为什么人们几乎总是使用 VAR 类型)。 MAX 类型只是可变的(即没有 CHAR(MAX)NCHAR(MAX))。