SQL Server文本types与varchar数据types
我有可变长度的字符数据,并希望存储在SQL Server(2005)数据库。 我想学习一些关于如何selectTEXT SQLtypes或者selectVARCHAR SQLtypes的最佳实践,在性能/占用空间/函数中优劣。
如果您使用SQL Server 2005或更高版本,请使用varchar(MAX) 。  text数据types已弃用,不应用于新的开发工作。 从文档 : 
重要
ntext,text和image数据types将在未来版本的Microsoft SQL Server中删除。 避免在新的开发工作中使用这些数据types,并计划修改当前正在使用它们的应用程序。 改用nvarchar(max) , varchar(max)和varbinary(max) 。
  TEXT用于大块的string数据。 如果字段的长度超过一定的阈值,则文本被存储在行外。 
  VARCHAR始终存储在行中,并且具有8000个字符的限制。 如果您尝试创buildVARCHAR(x) ,其中x> 8000 ,则会出现错误: 
服务器:消息131,级别15,状态3,行1
赋给'varchar'types的size()超出了任何数据types(8000)允许的最大值
 这些长度限制不涉及SQL Server 2005中的 VARCHAR(MAX) ,它可能像TEXT一样存储在行外。 
 请注意, MAX在这里不是一种常量, VARCHAR和VARCHAR(MAX)是非常不同的types,后者非常接近TEXT 。 
 在以前版本的SQL Server中,您无法直接访问TEXT ,只能获得TEXTPTR并在READTEXT和WRITETEXT函数中使用它。 
 在SQL Server 2005中,您可以直接访问TEXT列(尽pipe您仍然需要向VARCHAR进行显式转换才能为其分配值)。 
  TEXT很好: 
- 如果你需要在你的数据库中存储大文本
- 如果您不search列的值
- 如果您很lessselect此列,请不要join。
  VARCHAR是好的: 
- 如果你存储小string
- 如果您searchstring值
- 如果您始终select它或在连接中使用它。
通过select这里我的意思是发出任何查询返回列的值。
 通过在这里search ,我的意思是发出任何查询,其结果取决于TEXT或VARCHAR列的值。 这包括在任何JOIN或WHERE条件中使用它。 
 由于TEXT存储在行外,不涉及TEXT列的查询通常更快。 
 一些TEXT适合的例子: 
- 博客评论
- Wiki页面
- 代码源
 什么VARCHAR是好的一些例子: 
- 用户名
- 页面标题
- 文件名
 作为一个经验法则,如果您需要文本值超过200个字符,并且不在此列上使用连接,请使用TEXT 。 
 否则使用VARCHAR 。 
  PS这同样适用于启用了UNICODE NTEXT和NVARCHAR ,您应该使用上面的示例。 
  PPS同样适用于SQL Server 2005+使用的VARCHAR(MAX)和NVARCHAR(MAX) ,而不是TEXT和NTEXT 。 如果您希望它们始终存储在行外,则需要使用sp_tableoption large value types out of row启用large value types out of row 。 
 如上所述, 在这里 , TEXT将在未来版本中被弃用: 
text in row选项中的text in row将在未来版本的SQL Server中删除。 避免在新的开发工作中使用此选项,并计划修改当前text in row使用text in row应用程序。 我们build议您使用varchar(max),nvarchar(max)或varbinary(max)数据types来存储大量数据。 要控制这些数据types的行内和行外行为,请使用large value types out of row选项的large value types out of row。
 在SQL Server 2005中引入了新的数据types: varchar(max)和nvarchar(max)它们具有旧文本types的优点:它们可以包含op到2GB的数据,但是它们也具有varchar和nvarchar大部分优点。 其中的优点是能够使用string操作函数,如substring()。 
此外,varchar(max)存储在表(磁盘/内存)空间中,而大小低于8Kb。 只有当你在现场放置更多的数据时,它才被存储在表格的空间之外。 存储在表空间中的数据(通常)更快地检索。
总之,不要使用文本,因为有更好的select:(n)varchar(max)。 而当一个常规的varchar不够大时,也就是说,如果你想要存储的string超过8000个字符,只能使用varchar(max)。
如上所述,您可以在TEXT数据types上使用SUBSTRING,但只要TEXT字段包含less于8000个字符。
ms 2008有一些重大变化 – >在决定使用什么数据types时,可能值得考虑下面的文章。 http://msdn.microsoft.com/en-us/library/ms143432.aspx
每个字节
- varchar(max),varbinary(max),xml,text或image列2 ^ 31-1 2 ^ 31-1
- nvarchar(最大)列2 ^ 30-1 2 ^ 30-1