SQL Server文本types与varchar数据types

我有可变长度的字符数据,并希望存储在SQL Server(2005)数据库。 我想学习一些关于如何selectTEXT SQLtypes或者selectVARCHAR SQLtypes的最佳实践,在性能/占用空间/函数中优劣。

如果您使用SQL Server 2005或更高版本,请使用varchar(MAX)text数据types已弃用,不应用于新的开发工作。 从文档 :

重要

ntexttextimage数据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在这里不是一种常量, VARCHARVARCHAR(MAX)是非常不同的types,后者非常接近TEXT

在以前版本的SQL Server中,您无法直接访问TEXT ,只能获得TEXTPTR并在READTEXTWRITETEXT函数中使用它。

SQL Server 2005中,您可以直接访问TEXT列(尽pipe您仍然需要向VARCHAR进行显式转换才能为其分配值)。

TEXT很好:

  • 如果你需要在你的数据库中存储大文本
  • 如果您不search列的值
  • 如果您很lessselect此列,请不要join。

VARCHAR是好的:

  • 如果你存储小string
  • 如果您searchstring值
  • 如果您始终select它或在连接中使用它。

通过select这里我的意思是发出任何查询返回列的值。

通过这里search ,我的意思是发出任何查询,其结果取决于TEXTVARCHAR列的值。 这包括在任何JOINWHERE条件中使用它。

由于TEXT存储在行外,不涉及TEXT列的查询通常更快。

一些TEXT适合的例子:

  • 博客评论
  • Wiki页面
  • 代码源

什么VARCHAR是好的一些例子:

  • 用户名
  • 页面标题
  • 文件名

作为一个经验法则,如果您需要文本值超过200个字符,并且不在此列上使用连接,请使用TEXT

否则使用VARCHAR

PS这同样适用于启用了UNICODE NTEXTNVARCHAR ,您应该使用上面的示例。

PPS同样适用于SQL Server 2005+使用的VARCHAR(MAX)NVARCHAR(MAX) ,而不是TEXTNTEXT 。 如果您希望它们始终存储在行外,则需要使用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的数据,但是它们也具有varcharnvarchar大部分优点。 其中的优点是能够使用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

每个字节

  1. varchar(max),varbinary(max),xml,text或image列2 ^ 31-1 2 ^ 31-1
  2. nvarchar(最大)列2 ^ 30-1 2 ^ 30-1