SQL Server中varchar(500)与varchar(max)之间的区别

25

我想了解在性能、内存和其他方面使用varchar(500)与varchar(max)的优缺点是什么?

  • 它们是否使用相同的存储空间?

在SQL Server 2000/2005/2008的情况下,答案是否不同?


2
请查看我在这里的答案,了解另一个区别:https://dev59.com/-nI-5IYBdhLWcg3wHUdB#5654947。此外,还可以参考Remus Rusanu的博客文章:http://rusanu.com/2010/03/22/performance-comparison-of-varcharmax-vs-varcharn/。 - Martin Smith
请查看以下链接:https://dev59.com/I14b5IYBdhLWcg3wiSTV - vicky
1
似乎没有任何答案涉及性能或内存。 - johny why
2个回答

31
在 SQL Server 2000 和 SQL Server 7 中,一行的大小不能超过8000字节。这意味着 VARBINARY 列只能存储8000字节(假设它是表中唯一的列),VARCHAR 列最多可以存储8000个字符,NVARCHAR 列最多可以存储4000个字符(每个Unicode字符2个字节)。这种限制源于SQL Server使用的8KB内部页面大小来保存数据到磁盘。
为了在单个列中存储更多的数据,您需要使用 TEXT、NTEXT 或 IMAGE 数据类型(BLOBs),它们存储在一个独立于存储同一表中其他数据的数据页集合中。这些数据页按B树结构排列。BLOBs 难以处理和操作。它们不能用作过程或函数中的变量,也不能用于字符串函数,如 REPLACE、CHARINDEX 或 SUBSTRING。在大多数情况下,您必须使用 READTEXT、WRITETEXT 和 UPDATETEXT 命令来操作 BLOBs。
为解决这个问题,Microsoft 在 SQL Server 2005 中引入了 VARCHAR(MAX)、NVARCHAR(MAX) 和 VARBINARY(MAX) 数据类型。这些数据类型可以容纳与 BLOBs 相同数量的数据(2 GB),并且它们存储在用于其他数据类型的相同类型的数据页中。当 MAX 数据类型中的数据超过8 KB时,会使用溢出页。SQL Server 2005 自动为页面分配溢出指示器,并知道如何操作数据行,就像操作其他数据类型一样。您可以在存储过程或函数中声明 MAX 数据类型的变量,甚至将它们作为变量传递。您还可以在字符串函数中使用它们。
微软建议在SQL Server 2005中使用MAX数据类型而不是BLOB。事实上,在将来的SQL Server版本中,BLOB将被弃用。
来源:http://www.teratrax.com/articles/varchar_max.html
在 SQL Server 2005 和 SQL Server 2008 中,VARCHAR(MAX) 的最大存储大小为2^31-1字节(2,147,483,647字节或2GB - 1字节)。存储大小是实际输入数据的长度+2个字节。输入的数据可以是0个字符。由于VARCHAR数据类型中的每个字符使用一个字节,因此VARCHAR(MAX)数据类型的最大长度为2,147,483,645。
您可以阅读完整有趣的内容:http://www.sql-server-helper.com/faq/sql-server-2005-varchar-max-p01.aspx 参考:http://msdn.microsoft.com/en-us/library/ms143432.aspx

我唯一要补充的是关于2000限制的进一步说明——上面已经暗示了——如果您有多个varchar列,它们的组合长度不能超过8000。 - Damien_The_Unbeliever
赞同Paul的意见,另一个问题是,在varchar(500)的情况下,它会自动约束长度,而在varchar(max)的情况下,它不会。所以这也没关系。还有一件事,如果我们只需要存储500个字符,那么在任何情况下使用varchar(500)或varchar(max)来分配内存对于SQL Server是否有帮助? - Prashant Lakhlani
1
@lakhlaniprashant(OP):MSDN清楚地说明:“当列数据条目的大小差异很大且大小可能超过8,000字节时,请使用varchar(max)。”在这里:http://msdn.microsoft.com/en-us/library/ms176089.aspx因此,除非您真正需要它,否则不要这样做。 - shamittomar

4

VARCHAR(MAX)列可以接受501个或更多字符,而VARCHAR(500)列则不能。所以如果你有一个业务规则限制值为500个字符,那么VARCHAR(500)更合适。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接