我有可变长度的字符数据,并希望存储在SQL Server (2005)数据库中。我想了解一些关于如何选择TEXT SQL类型或选择VARCHAR SQL类型的最佳实践,以及性能/内存占用/函数的优缺点。
发布于 2009-02-19 11:13:04
如果您使用的是SQL Server2005或更高版本,请使用varchar(MAX)。text数据类型已弃用,不应用于新的开发工作。来自the docs
重要
Microsoft SQL Server的未来版本中将删除ntext、text,和image数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。改为使用nvarchar(max)、varchar(max)和varbinary(max)。
发布于 2009-02-19 11:07:59
TEXT用于大块字符串数据。如果字段长度超过某个阈值,则文本将被存储在行外。
VARCHAR始终以行的形式存储,且不超过8000个字符。如果您尝试创建一个VARCHAR(x),其中x> 8000,则会得到一个错误:
服务器:消息131,级别15,状态3,行1
赋予类型“varchar”的大小()超过了任何数据类型允许的最大值(8000)
这些长度限制与SQL Server2005中的VARCHAR(MAX)无关,SQL Server2005可以像TEXT一样存储在行外。
注意,MAX在这里不是一种常量,VARCHAR和VARCHAR(MAX)是非常不同的类型,后者非常接近TEXT。
在以前的SQL Server版本中,您不能直接访问TEXT,只能获取TEXTPTR并在READTEXT和WRITETEXT函数中使用它。
在SQL Server2005中,可以直接访问TEXT列(尽管仍然需要显式转换为VARCHAR来为它们赋值)。
TEXT很好:
VARCHAR很好:
如果您存储小字符串,请执行
通过选择此处,我的意思是发出任何返回该列的值的查询。
这里的搜索是指发出其结果取决于TEXT或VARCHAR列的值的任何查询。这包括在任何JOIN或WHERE条件下使用它。
由于TEXT存储在行外,因此不涉及TEXT列的查询通常会更快。
以下是TEXT优势的一些示例:
以下是VARCHAR优势的一些示例:
根据经验,如果您需要文本值超过200个字符,和不要对此列使用join,请使用TEXT。
否则,请使用VARCHAR。
附注:同样的情况也适用于支持UNICODE的NTEXT和NVARCHAR,您应该在上面的示例中使用它们。
附注:这同样适用于SQL Server 2005+使用的VARCHAR(MAX)和NVARCHAR(MAX),而不是TEXT和NTEXT。如果您希望它们始终存储在行外,则需要使用sp_tableoption为它们启用large value types out of row。
正如上面提到的和,TEXT将在未来的版本中被弃用:
SQL Server的未来版本中将删除
text in row选项。避免在新的开发工作中使用此选项,并计划修改当前使用text in row的应用程序。建议您使用varchar(max)、nvarchar(max)或varbinary(max)数据类型存储大型数据。要控制这些数据类型的行内和行外行为,请使用large value types out of row选项。
发布于 2009-02-19 11:18:48
在SQL server2005中引入了新的数据类型:varchar(max)和nvarchar(max),它们具有旧的text类型的优点:它们可以包含op到2 2GB的数据,但它们也具有varchar和nvarchar的大部分优点。这些优点之一是能够使用字符串操作函数,如substring()。
此外,varchar(max)存储在表的(磁盘/内存)空间中,而大小小于8Kb。只有当您在字段中放置更多数据时,这些数据才会存储在表的空间之外。(通常)检索存储在表空间中的数据的速度更快。
简而言之,永远不要使用文本,因为有一个更好的选择:(n)varchar(max)。并且仅当常规的varchar不够大时才使用varchar(max),即如果您期望要存储的字符串超过8000个字符。
如前所述,您可以对TEXT数据类型使用SUBSTRING,但前提是文本字段包含的字符少于8000个字符。
https://stackoverflow.com/questions/564755
复制相似问题