varchar(max)似乎最多可以存储2GB.
我无法理解的是,在这个链接 sql row overflow MS说(我的重点):
A table can contain a maximum of 8,060 bytes per row. In sql Server
2008,this restriction is relaxed for tables that contain varchar,
nvarchar,varbinary,sql_variant,or CLR user-defined type columns.
The length of each one of these columns must still fall within the
limit of 8,000 bytes; however,their combined widths can exceed the
8,060-byte limit. This applies to varchar,nvarchar,varbinary,
sql_variant,or CLR user-defined type columns when they are created
and modified,and also to when data is updated or inserted.
我不明白这个说法.
他们说varchar(max)可以容纳2GB但是他们在上面的链接中说列长度不能超过8KB
这不是矛盾的,还是我在这里遗漏了什么?
解决方法
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的数据,但不是存储在行中).