这个问题与我的SQL 数据类型大小
Avarchar(max)
似乎最多可以存储 2GB。
但我不明白的是,在这个链接中SQL行溢出MS 说(我强调):
表每行最多可包含 8,060 个字节。在 SQL Server 2008 中,对于包含 varchar、nvarchar、varbinary、sql_variant 或 CLR 用户定义类型列的表,此限制有所放宽。 每列的长度仍必须在 8,000 字节的限制范围内;但是,它们的组合宽度可以超过 8,060 字节的限制。这适用于 varchar、nvarchar、varbinary、sql_variant 或 CLR 用户定义类型列的创建和修改时间,以及数据更新或插入时间。
我不明白这句话。
他们说 avarchar(max)
最多可以容纳 2GB,但他们在上面的链接中说列长度不能超过 8KB
这不是自相矛盾吗,还是我这里漏掉了什么?
答案1
为了更清楚地说明,我们可以采用第一个非常基本的陈述:
A table can contain a maximum of 8,060 bytes per row.
换句话说:每行必须适合一页(8 kB)。如果可能的话,多行可以适合一页 - 但绝不能反过来。
那么二进制大对象 (TEXT、NTEXT、BLOB) 呢?这些列中的数据存储在一个特殊位置。行仅包含指向数据的指针,因此上述基本陈述仍然成立:表行必须适合一页。
Binary large data is stored outside of the table.
Each table row just holds a pointer in each BLOB field which actually points to the data.
话虽如此,新的 varchar(max) 功能很特殊,其行为如下:
- varchar(n):通常文本字段存储在行中,行数据必须适合一页。
- varchar(max),小数据内容:只要所有行数据适合一页,就会按行存储。
- varchar(max),大数据内容:一旦数据不再适合一页,就会将指针存储在行中,并将 varchar(max) 数据单独存储。在这种情况下,varchar(max) 的行为类似于文本数据类型。
注意大数据内容取决于表的所有其他列。此外,varchar(max) 可以以压缩形式存储文本,这样一页数据就可以容纳超过 8,060 个字符。
我认为,该声明每列的长度仍必须在 8,000 字节的限制范围内似乎不准确,甚至可能不正确(varchar(max)列实际上可以容纳 2 GB 的数据,尽管没有存储在行中)。