SQL Server文本类型与varchar数据类型

SQL Server Text type vs. varchar data type

我有可变长度的字符数据,并希望存储在SQL Server(2005)数据库中。 我想学习一些关于如何选择TEXT SQL类型或选择VARCHAR SQL类型的最佳实践,以及性能/覆盖/功能的优缺点。


TEXT用于大量的字符串数据。如果字段的长度超过某个阈值,则文本将存储在行外。

VARCHAR始终存储在行中,并且限制为8000个字符。如果您尝试创建VARCHAR(x),其中x> 8000,则会出现错误:

Server: Msg 131, Level 15, State 3, Line 1

The size () given to the type ‘varchar’ exceeds the maximum allowed for any data type (8000)

这些长度限制与SQL Server 2005中的VARCHAR(MAX)无关,它可能存储在行外,就像TEXT一样。

注意,MAX在这里不是一种常数,VARCHARVARCHAR(MAX)是非常不同的类型,后者非常接近TEXT

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

在SQL Server 2005中,您可以直接访问TEXT列(尽管您仍然需要显式转换为VARCHAR来为它们分配值)。

TEXT很好:

  • 如果需要在数据库中存储大型文本
  • 如果不搜索列的值
  • 如果您很少选择此列并且不加入该列。

VARCHAR很好:

  • 如果你存储小字符串
  • 如果搜索字符串值
  • 如果您总是选择它或在连接中使用它。

在这里选择我的意思是发出任何返回列值的查询。

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

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

TEXT的一些例子适用于:

  • 博客评论
  • 维基页面
  • 代码来源

VARCHAR的一些例子适用于:

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

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

否则使用VARCHAR

附:这同样适用于UNICODE启用的NTEXTNVARCHAR,您应该将其用于上面的示例。

P.P.S.这同样适用于SQL Server 2005+使用的VARCHAR(MAX)NVARCHAR(MAX),而不是TEXTNTEXT。如果希望它们始终存储在行外,则需要为sp_tableoption启用large value types out of row

如上所述,TEXT将在以后的版本中弃用:

The text in row option will be removed in a future version of SQL Server. Avoid using this option in new development work, and plan to modify applications that currently use text in row. We recommend that you store large data by using the varchar(max), nvarchar(max), or varbinary(max) data types. To control in-row and out-of-row behavior of these data types, use the large value types out of row option.


如果您使用的是SQL Server 2005或更高版本,请使用VARCHAR(MAX)。不推荐使用TEXT数据类型,不应将其用于新的开发工作。来自文档:

Important

ntext , text, and image data types will be removed in a future version of Microsoft SQL Server. Avoid using these data types in new development work, and plan to modify applications that currently use them. Use nvarchar(max), varchar(max), and varbinary(max) instead.


在SQL Server 2005中引入了新的数据类型:VARCHAR(MAX)NVARCHAR(MAX)
它们具有旧文本类型的优点:它们可以包含2GB的数据,但它们也具有VARCHARNVARCHAR的大部分优点。这些优点包括使用字符串操作函数,如substring()。

此外,varchar(max)存储在表的(磁盘/内存)空间中,而大小低于8Kb。只有当您在字段中放置更多数据时,它才会存储在表的空间之外。存储在表空间中的数据(通常)可以更快地检索。

简而言之,永远不要使用Text,因为有更好的选择:(n)varchar(max)。并且只在常规varchar不够大时使用varchar(max),即如果您希望存储的字符串超过8000个字符。

如上所述,您可以在TEXT数据类型上使用SUBSTRING,但只有TEXT字段包含少于8000个字符。


ms 2008中有一些重大变化 - >在决定使用何种数据类型时,可能值得考虑以下文章。
http://msdn.microsoft.com/en-us/library/ms143432.aspx

字节数

  • varchar(max),varbinary(max),xml,text或image column 2 ^ 31-1 2 ^ 31-1
  • nvarchar(max)列2 ^ 30-1 2 ^ 30-1