问答中心分类: SQLSQL Server文本类型与varchar数据类型
0
Quassnoi 提问 18小时 前

就目前而言,这个问题并不适合我们的问答形式。我们希望答案能得到事实、参考资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或更广泛的讨论。如果你觉得这个问题可以改进,可能会重新讨论,访问帮助中心用于指导。

关闭10年前.

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

3 Answers
0
Quassnoi 回答 18小时 前

TEXT用于大块字符串数据。如果字段长度超过某个阈值,则文本在行外存储。
VARCHAR始终存储在行中,限制为8000字符。如果您尝试创建VARCHAR(x)哪里x>8000,您会得到一个错误:

服务器:Msg 131,15级,状态3,第1行
类型“varchar”的大小()超过了任何数据类型允许的最大值(8000)

这些长度限制与此无关VARCHAR(MAX)在里面SQL Server 2005,可以在行外存储,就像TEXT.
请注意MAX这里不是常数,VARCHARVARCHAR(MAX)是非常不同的类型,后者非常接近TEXT.
在早期版本中SQL Server您无法访问TEXT直接来说,你只能得到一个TEXTPTR并将其用于READTEXTWRITETEXT功能。
在里面SQL Server 2005您可以直接访问TEXT列(尽管您仍然需要显式转换来VARCHAR为其赋值)。
TEXT很好:

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

VARCHAR很好:

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

通过选择这里我的意思是发出任何返回列值的查询。
通过搜索这里我的意思是发出任何查询,其结果取决于TEXTVARCHAR柱这包括在任何JOINWHERE条件
作为TEXT存储在行外,查询不涉及TEXT列通常更快。
什么的一些例子TEXT适用于:

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

什么的一些例子VARCHAR适用于:

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

根据经验,如果您需要文本值超过200人物不要在此列上使用连接,请使用TEXT.
否则使用VARCHAR.
附笔。这同样适用于UNICODE启用NTEXTNVARCHAR同样,您应该在上面的示例中使用它。
P、 P.S。这同样适用于VARCHAR(MAX)NVARCHAR(MAX)那个SQL Server 2005+使用而不是TEXTNTEXT。您需要启用large value types out of row为他们提供sp_tableoption如果您希望它们始终存储在行外。
如上所述在这里,TEXT在未来的版本中将被弃用:

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

George2 回复 18小时 前

1.“如果你不搜索列的值”——你能告诉我“搜索”是什么意思吗?你的意思是选择这个列,对这个列排序,像这个列一样,或者在这个列上使用一些字符串操作函数?

George2 回复 18小时 前

2.“VARCHAR始终存储在第行中,限制为8000个字符。”——抱歉,我不同意你的意见。VARCHAR可以长于8000,如果长于8000,则VARCHAR将存储在列以外的位置。有什么意见吗?

George2 回复 18小时 前

3.Mladen Prajdic在这篇文章中提到,文本类型是不推荐的,但我没有发现任何文件涵盖这一点。你有这方面的文件吗?

George2 回复 18小时 前

酷毙了卡西诺!你真有学问!:-)还有一个问题–“这当然与VARCHAR(MAX)无关,VARCHAR是SQL SERVER 2005的文本同义词。”“这”是什么意思?

George2 回复 18小时 前

“这当然与VARCHAR(MAX)无关,因为对于SQL SERVER 2005来说,VARCHAR是文本的同义词。”–您是否有任何文档表明文本与SQL SERVER 2005中的VARCHAR相同?我做了一些搜索,但找不到官方文件。:-)

George2 回复 18小时 前

顺便说一句:我不认为TEXT和VARCHAR完全相同,因为TEXT可能超过8000个字符。有什么意见吗?

Quassnoi 回复 18小时 前

VARCHAR和VARCHAR(MAX)是非常不同的类型。TEXT和VARCHAR(MAX)在存储方式上相同,但在访问方式上不同。

Quassnoi 回复 18小时 前

当然,TEXT和VARCHAR(8000)是不同的。例如,您不能创建VARCHAR(8001),您需要VARCHAR(MAX)。

George2 回复 18小时 前

对不起,我很困惑。我一直认为SQL Server中只有一种数据类型叫VARCHAR,所以VARCHAR和VARCHAR(MAX)是相同的。我错了吗-(你能提供一些关于这个主题的链接或文档吗?

George2 回复 18小时 前

“但在访问它们的方式上有所不同”——你说的访问是什么意思?你能给我举个例子吗?:-)

Quassnoi 回复 18小时 前

VARCHAR和VARCHAR(MAX)的存储方式不同。至于文本值,您不能更新table SET TEXT\u column=integer\u colum,您需要更新table SET TEXT\u column=CAST(integer\U column As VARCHAR)

Nikos Steiakakis 回复 18小时 前

由于SQL server 2005文本已被varchar(max)或nvarchar(max)“替换”,因此答案基于谬误。很抱歉

0
edosoft 回答 18小时 前

SQL server 2005引入了新的数据类型:varchar(max)nvarchar(max)它们具有旧文本类型的优点:它们可以包含op到2GB的数据,但也具有varcharnvarchar。其中的优势是能够使用字符串操作函数,如substring()。
此外,当大小低于8Kb时,varchar(max)存储在表的(磁盘/内存)空间中。只有在字段中放置更多数据时,才会将其存储在表的空间之外。存储在表空间中的数据(通常)检索得更快。
简而言之,永远不要使用文本,因为还有更好的选择:(n)varchar(max)。并且仅当常规varchar不够大时才使用varchar(max),即如果您希望要存储的字符串将超过8000个字符。
如前所述,您可以在文本数据类型上使用子字符串,但前提是文本字段包含少于8000个字符。

George2 回复 18小时 前

谢谢Edoode,您完整地回答了VARCHAR有多好,但是关于何时使用Varchars以及何时使用文本,您有什么意见或想法吗?我的问题是从2期中选择1期。:-)

Quassnoi 回复 18小时 前

实际上,在MS SQL Server 2005中,您也可以在文本列上使用子字符串和其他函数。

George2 回复 18小时 前

谢谢你!文本似乎已弃用。还有一个问题,我们如何选择在不同的情况下使用VARCHAR或VARCHAR(MAX)?

edosoft 回复 18小时 前

只有在常规varchar不够大时才使用varchar(max)(8Kb应该足够每个人使用;)

0
Draz 回答 18小时 前

ms 2008中有一些重大变化->在决定使用何种数据类型时,可能值得考虑下面的文章。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(max)第2^30-1列
Martin Smith 回复 18小时 前

变化?自从引入新的数据类型以来,这些容量没有改变。