我创建了一个列类型为的表nvarchar(max)
,我的理解是它们可以支持 2GB。但是在插入时,我仍然收到此错误:
无法创建大于允许的最大行大小 8060 的大小为 8061 的行。
是否需要对数据库进行全局设置,还是我要达到另一个限制?varchar(max)
每个表的字段数有限制吗?
我创建了一个列类型为的表nvarchar(max)
,我的理解是它们可以支持 2GB。但是在插入时,我仍然收到此错误:
无法创建大于允许的最大行大小 8060 的大小为 8061 的行。
是否需要对数据库进行全局设置,还是我要达到另一个限制?varchar(max)
每个表的字段数有限制吗?
SQL Server 使用页面来存储数据。页面大小为 8kb。
因此 SQL Server 中的记录大小(行大小)不能大于 8060 字节。
如果数据不适合 8060 字节,则使用引用指针。 当 varchar、nvarchar、varbinary、sql_variant 或 CLR 用户定义类型列的组合超过此限制时,SQL Server 数据库引擎将具有最大宽度的记录列移动到 ROW_OVERFLOW_DATA 分配单元中的另一个页面,同时保持24-原始页面上的字节指针。
将大记录移动到另一个页面是动态发生的,因为记录基于更新操作而被延长。缩短记录的更新操作可能会导致记录移回 IN_ROW_DATA 分配单元中的原始页面。
此外,查询和执行其他选择操作,例如对包含行溢出数据的大型记录进行排序或连接会减慢处理时间,因为这些记录是同步处理的,而不是异步处理的。
使用稀疏列的表的记录大小限制为8,018 字节。当转换后的数据加上已有记录数据超过 8018 字节时,返回 MSSQLSERVER ERROR 576。在稀疏类型和非稀疏类型之间转换列时,数据库引擎会保留当前记录数据的副本。这会暂时使记录所需的存储空间增加一倍。.
要获取有关可能包含行溢出数据的表或索引的信息,请使用 sys.dm_db_index_physical_stats 动态管理函数。
从 SQL Server 文档:
对于 varchar、nvarchar、varbinary、sql_variant 和 CLR 用户定义类型列,各个列的长度仍必须在 8,000 字节的限制范围内。只有它们的组合长度可以超过表的 8,060 字节行限制。
其他数据类型列的总和,包括 char 和 nchar 数据, 必须在 8,060 字节的行限制之内。大对象数据也不受 8,060 字节行的限制。
更多信息在这里:https ://technet.microsoft.com/en-us/library/ms186981%28v=sql.105%29.aspx
这来自 StackOverflow 上的较早线程,可在此处找到:
无法创建大于允许的最大值 8060 的大小为 8937 的行
导致该错误的原因是 SQL Server 中的行不能大于 8KB(1 页大小),因为行不允许跨页 - 这是 SQL Server [...]
请注意,SQL Server 将允许您创建表,但是如果您尝试实际插入跨越多个页面的任何数据,则会出现上述错误。当然,这并没有完全加起来,因为如果以上是全部事实,那么单个 VARCHAR(8000) 列将填充表中的一行!(这曾经是这种情况)。SQL Server 2005 通过允许将行中的某些数据存储在另一个页面中,而不是保留一个 24 位指针来解决此限制。
我建议将您的表格规范化为一个或多个相关表格。