我想知道在使用varchar(500)和varchar(max)时在性能,内存和其他任何需要考虑的方面有什么利弊?
sql server 2000/2005/2008的答案是否有所不同?
答案 0 :(得分:31)
在SQL Server 2000和SQL Server 7中,行的大小不能超过8000个字节。这意味着VARBINARY列只能存储8000个字节(假设它是表中唯一的列),VARCHAR列最多可存储8000个字符,NVARCHAR列最多可存储4000个字符(每个unicode字符2个字节)。此限制源于SQL Server用于将数据保存到磁盘的8 KB内部页面大小。
要在单个列中存储更多数据,您需要使用TEXT,NTEXT或IMAGE数据类型(BLOB),这些数据类型存储在8 KB数据页的集合中,这些数据页与存储其他数据页的数据页分开同一个表中的数据。这些数据页以B树结构排列。 BLOB难以使用和操作。它们不能用作过程或函数中的变量,也不能在REPLACE,CHARINDEX或SUBSTRING等字符串函数中使用。在大多数情况下,您必须使用READTEXT,WRITETEXT和UPDATETEXT命令来操作BLOB。
为了解决这个问题,Microsoft在SQL Server 2005中引入了VARCHAR(MAX),NVARCHAR(MAX)和VARBINARY(MAX)数据类型。这些数据类型可以保存BLOB可以容纳的相同数量的数据(2 GB)它们存储在用于其他数据类型的相同类型的数据页中。当MAX数据类型的数据超过8 KB时,使用溢出页面。 SQL Server 2005自动为页面分配溢出指示器,并且知道如何操纵数据行的方式与操作其他数据类型的方式相同。您可以在存储过程或函数内声明MAX数据类型的变量,甚至将它们作为变量传递。您也可以在字符串函数中使用它们。
Microsoft建议在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
答案 1 :(得分:4)
VARCHAR(MAX)
列将接受501个字符或更多的值,而VARCHAR(500)
列则不会。因此,如果您的业务规则将值限制为500个字符,那么VARCHAR(500)
将更合适。