我有可变长度的字符数据,并希望存储在SQL Server(2005)数据库中。 我想学习一些关于如何选择TEXT SQL类型或选择VARCHAR SQL类型的最佳实践,以及性能/覆盖/功能的优缺点。
-
如果Google将您发送到此处:MSDN 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在这里不是一种常数,VARCHAR和VARCHAR(MAX)是非常不同的类型,后者非常接近TEXT。
在SQL Server的早期版本中,您无法直接访问TEXT,只能获得TEXTPTR并在READTEXT和WRITETEXT函数中使用它。
在SQL Server 2005中,您可以直接访问TEXT列(尽管您仍然需要显式转换为VARCHAR来为它们分配值)。
TEXT很好:
-
如果需要在数据库中存储大型文本
-
如果不搜索列的值
-
如果您很少选择此列并且不加入该列。
VARCHAR很好:
-
如果你存储小字符串
-
如果搜索字符串值
-
如果您总是选择它或在连接中使用它。
在这里选择我的意思是发出任何返回列值的查询。
通过在这里搜索,我的意思是发出任何查询,其结果取决于TEXT或VARCHAR列的值。这包括在任何JOIN或WHERE条件下使用它。
由于TEXT存储在行外,因此不涉及TEXT列的查询通常更快。
TEXT的一些例子适用于:
VARCHAR的一些例子适用于:
根据经验,如果您需要文本值超过200个字符并且不在此列上使用连接,请使用TEXT。
否则使用VARCHAR。
附:这同样适用于UNICODE启用的NTEXT和NVARCHAR,您应该将其用于上面的示例。
P.P.S.这同样适用于SQL Server 2005+使用的VARCHAR(MAX)和NVARCHAR(MAX),而不是TEXT和NTEXT。如果希望它们始终存储在行外,则需要为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.
-
1."如果你不搜索专栏的价值" - 你能告诉我你的意思是"搜索"吗?您的意思是选择此列,订购此列,LIKE此列或使用此列上的某些字符串操作函数?
-
2."VARCHAR始终存储在行中,并且限制为8000个字符。" - 对不起,我不同意你的看法。 VARCHAR可能长于8000,如果长度超过8000,则VARCHAR将存储在列之外。任何意见?
-
3. Mladen Prajdic在这个帖子中提到,TEXT类型已被弃用,但我没有找到任何文件涵盖这一点。你有任何文件涵盖这个吗?
-
查看更新的帖子
-
酷Quassnoi!你是如此知识渊博! :-)还有一个问题 -"这当然不涉及VARCHAR(MAX),这与SQL SERVER 2005是TEXT的同义词。""这个"你的意思是什么?
-
"这当然不涉及VARCHAR(MAX),这与SQL SERVER 2005是TEXT的同义词。" - 你有没有任何文件说TEXT与SQL Server 2005中的VARCHAR相同?我做了一些搜索,但找不到官方文件。 :-)
-
顺便说一句:我不认为TEXT和VARCHAR完全相同,因为TEXT可能超过8000个字符。任何意见?
-
VARCHAR和VARCHAR(MAX)是非常不同的类型。 TEXT和VARCHAR(MAX)在存储方式方面相同,但在访问方式方面有所不同。
-
当然TEXT和VARCHAR(8000)不一样。你不能创建一个VARCHAR(8001),例如,你需要VARCHAR(MAX)。
-
对不起,我很困惑。我一直认为SQL Server中只有一种称为VARCHAR的数据类型,因此VARCHAR和VARCHAR(MAX)是相同的。我错了吗? :-(你能提供一些关于这个主题的链接或文件吗?
-
"但在如何访问它们方面有所不同" - 你的意思是什么?你能告诉我一个例子吗? :-)
-
VARCHAR和VARCHAR(MAX)是不同的类型,它们的存储方式如何。至于TEXT值,你不能做UPDATE表SET text_column = integer_column,你需要做UPDATE表SET text_column = CAST(integer_column AS VARCHAR)
-
由于SQL server 2005文本已被varchar(max)或nvarchar(max)"替换",因此答案基于谬误。抱歉。
-
200来自哪里?
如果您使用的是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.
-
谢谢Mladen,我很惊讶地发现TEXT已被弃用。你有任何官方文件提到这个吗?
-
虽然这不是"官方",但它确实涵盖了基础知识。文本实际上是折旧的&也不支持varchar(max)所做的一切,比如搜索和搜索的能力。指数。 blog.sqlauthority.com/2007/05/26/…
-
这是有道理的:) msdn.microsoft.com/en-us/library/ms187993.aspx
-
酷achinda99和Mladen Prajdic!你提供的是我正在寻找的。 :-)还有一个问题,我们如何选择在不同情况下使用VARCHAR还是VARCHAR(MAX)?
-
关于它的官方MS信息已被弃用:msdn.microsoft.com/en-us/library/ms187993%28v=sql.90%29.aspx
-
嗯......即使是上面链接的官方文档也没有说明为何删除它。任何的想法?我很好奇。
-
因为这个架构已经过时了。 (max)数据类型针对当前时间进行了更优化
在SQL Server 2005中引入了新的数据类型:VARCHAR(MAX)和NVARCHAR(MAX)
它们具有旧文本类型的优点:它们可以包含2GB的数据,但它们也具有VARCHAR和NVARCHAR的大部分优点。这些优点包括使用字符串操作函数,如substring()。
此外,varchar(max)存储在表的(磁盘/内存)空间中,而大小低于8Kb。只有当您在字段中放置更多数据时,它才会存储在表的空间之外。存储在表空间中的数据(通常)可以更快地检索。
简而言之,永远不要使用Text,因为有更好的选择:(n)varchar(max)。并且只在常规varchar不够大时使用varchar(max),即如果您希望存储的字符串超过8000个字符。
如上所述,您可以在TEXT数据类型上使用SUBSTRING,但只有TEXT字段包含少于8000个字符。
-
感谢Edoode,你回答了整个VARCHAR有多好,但有关何时使用VARCHAR以及何时使用TEXT的任何意见或想法?我的问题是从2期中选择1。 :-)
-
实际上,在MS SQL Server 2005中,您也可以在TEXT列上使用SUBSTRING和其他函数。
-
谢谢Quassnoi!看起来像TEXT已被弃用。还有一个问题,我们如何选择在不同情况下使用VARCHAR还是VARCHAR(MAX)?
-
只有当常规varchar不够大时才使用varchar(max)(每个人8Kb应该足够了;)
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