SQL Server文本类型与varchar数据类型[关闭]


287

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


17
如果Google在这里发送了您:MSDN SQL数据类型页面可能会有所帮助。
Jeroen 2012年

Answers:


212

如果您使用的是SQL Server 2005或更高版本,请使用varchar(MAX)。该text数据类型是过时的,不应该被用于新的开发工作。从文档

重要

ntexttext和,image数据类型将在将来的Microsoft SQL Server版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用nvarchar(max)varchar(max)varbinary(max)


3
感谢Mladen,我很惊讶看到TEXT被弃用。您是否有任何官方文件提及此?
2009年

1
虽然这不是“官方的”,但确实涵盖了基础知识。实际上,文本已贬值,并且不支持varchar(max)所做的所有事情,例如搜索和索引功能。blog.sqlauthority.com/2007/05/26/…– achinda99
2009年


1
酷achinda99和Mladen Prajdic!您提供的是我正在寻找的东西。:-)还有一个问题,我们如何选择在不同情况下使用VARCHAR还是VARCHAR(MAX)?
2009年

1
已弃用有关它的官方MS信息:msdn.microsoft.com/zh-cn/library/ms187993%28v=sql.90%29.aspx
Fanda

283

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

VARCHAR始终存储在行中,并且限制为8000个字符。如果你尝试创建VARCHAR(x),其中X> 8000,你会得到一个错误:

服务器:消息131,级别15,状态3,第1行

赋予'varchar'类型的size()超出了任何数据类型所允许的最大值(8000)

这些长度限制VARCHAR(MAX)SQL Server 2005无关,后者可能像行一样存储在行外TEXT

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

SQL Server的早期版本中,您无法TEXT直接访问Direct,只能TEXTPTRREADTEXTWRITETEXT函数中获取和使用它。

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

TEXT 很好:

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

VARCHAR 很好:

  • 如果您存放一点串
  • 如果您搜索字符串值
  • 如果始终选择它或在联接中使用它。

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

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

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

TEXT有益的一些例子:

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

VARCHAR有益的一些例子:

  • 用户名
  • 页面标题
  • 档名

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

否则使用VARCHAR

PS这同样适用于UNICODE启用NTEXTNVARCHAR为好,你应该使用上面的例子。

PPS这同样适用于VARCHAR(MAX)NVARCHAR(MAX)SQL服务器2005+的用途,而不是TEXTNTEXT。如果要始终将它们存储在行外large value types out of rowsp_tableoption则需要启用它们。

如上文和此处所述TEXT在将来的版本中将不推荐使用:

text in row选项将在SQL Server的将来版本中删除。避免在新的开发工作中使用此选项,并计划修改当前使用的应用程序text in row。我们建议您通过使用存储大量数据varchar(max)nvarchar(max)varbinary(max)数据类型。要控制这些数据类型的行内和行外行为,请使用该large value types out of row选项。


2
1.“如果您不搜索列的值”-您能告诉我“搜索”是什么意思吗?您的意思是选择此列,订购此列,喜欢此列还是在此列上使用一些字符串操作功能?
2009年

2
2.“ VARCHAR始终存储在行中,并且限制为8000个字符。” -对不起,我不同意你的看法。VARCHAR可能长于8000,如果长于8000,则VARCHAR将存储在列之外。任何意见?
2009年

1
3.在该线程中提到的Mladen Prajdic,不推荐使用TEXT类型,但我找不到任何涵盖此内容的文档。您有任何文件涵盖此吗?
2009年

2
酷夸斯诺伊!你是如此博学!:-)还有一个问题-“这当然不涉及VARCHAR(MAX),因为VARCHAR(MAX)对于SQL SERVER 2005是TEXT的同义词。” “这个”你是什么意思?
2009年

“当然,这与VARCHAR(MAX)无关,它与SQL SERVER 2005一样是TEXT的同义词。” -是否有任何文档说TEXT与SQL Server 2005中的VARCHAR相同?我进行了一些搜索,但找不到官方文件。:-)
George2,2009年

41

在SQL Server中引入2005年的新数据类型:varchar(max)nvarchar(max) 他们有老的文本类型的优点:它们可以包含运到2GB的数据,但他们也有大部分的优点varcharnvarchar。这些优点包括使用诸如substring()之类的字符串操作功能的能力。

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

简而言之,不要使用Text,因为还有更好的选择:(n)varchar(max)。并且仅当常规varchar不够大时才使用varchar(max),即,如果您预期要存储的字符串将超过8000个字符。

如前所述,可以在TEXT数据类型上使用SUBSTRING,但前提是TEXT字段的字符数少于8000。


1
感谢Edoode,您完全回答了VARCHAR有多好,但是关于何时使用VARCHAR和何时使用TEXT有任何意见或想法吗?我的问题是关于从2期中选择1期。:-)
George2,2009年

1
实际上,在MS SQL Server 2005中,您也可以在TEXT列上使用SUBSTRING和其他功能。
Quassnoi

1
感谢Quassnoi!似乎已弃用TEXT。还有一个问题,我们如何选择在不同情况下使用VARCHAR还是VARCHAR(MAX)?
2009年

1
仅当常规varchar不够大时才使用varchar(max)(每个人都应该使用8Kb就足够了;)
edosoft

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.