SQL Server文本types与varchar数据types
我有可变长度的字符数据,并希望存储在SQL Server(2005)数据库。 我想学习一些关于如何selectTEXT SQLtypes或者selectVARCHAR SQLtypes的最佳实践,在性能/占用空间/函数中优劣。
如果您使用SQL Server 2005或更高版本,请使用varchar(MAX)
。 text
数据types已弃用,不应用于新的开发工作。 从文档 :
重要
ntext
,text
和image
数据types将在未来版本的Microsoft SQL Server中删除。 避免在新的开发工作中使用这些数据types,并计划修改当前正在使用它们的应用程序。 改用nvarchar(max) , varchar(max)和varbinary(max) 。
TEXT
用于大块的string数据。 如果字段的长度超过一定的阈值,则文本被存储在行外。
VARCHAR
始终存储在行中,并且具有8000个字符的限制。 如果您尝试创buildVARCHAR(x)
,其中x> 8000 ,则会出现错误:
服务器:消息131,级别15,状态3,行1
赋给'varchar'types的size()超出了任何数据types(8000)允许的最大值
这些长度限制不涉及SQL Server 2005中的 VARCHAR(MAX)
,它可能像TEXT
一样存储在行外。
请注意, MAX
在这里不是一种常量, VARCHAR
和VARCHAR(MAX)
是非常不同的types,后者非常接近TEXT
。
在以前版本的SQL Server中,您无法直接访问TEXT
,只能获得TEXTPTR
并在READTEXT
和WRITETEXT
函数中使用它。
在SQL Server 2005中,您可以直接访问TEXT
列(尽pipe您仍然需要向VARCHAR
进行显式转换才能为其分配值)。
TEXT
很好:
- 如果你需要在你的数据库中存储大文本
- 如果您不search列的值
- 如果您很lessselect此列,请不要join。
VARCHAR
是好的:
- 如果你存储小string
- 如果您searchstring值
- 如果您始终select它或在连接中使用它。
通过select这里我的意思是发出任何查询返回列的值。
通过在这里search ,我的意思是发出任何查询,其结果取决于TEXT
或VARCHAR
列的值。 这包括在任何JOIN
或WHERE
条件中使用它。
由于TEXT
存储在行外,不涉及TEXT
列的查询通常更快。
一些TEXT
适合的例子:
- 博客评论
- Wiki页面
- 代码源
什么VARCHAR
是好的一些例子:
- 用户名
- 页面标题
- 文件名
作为一个经验法则,如果您需要文本值超过200个字符,并且不在此列上使用连接,请使用TEXT
。
否则使用VARCHAR
。
PS这同样适用于启用了UNICODE
NTEXT
和NVARCHAR
,您应该使用上面的示例。
PPS同样适用于SQL Server 2005+使用的VARCHAR(MAX)
和NVARCHAR(MAX)
,而不是TEXT
和NTEXT
。 如果您希望它们始终存储在行外,则需要使用sp_tableoption
large value types out of row
启用large value types out of row
。
如上所述, 在这里 , TEXT
将在未来版本中被弃用:
text in row
选项中的text in row
将在未来版本的SQL Server中删除。 避免在新的开发工作中使用此选项,并计划修改当前text in row
使用text in row
应用程序。 我们build议您使用varchar(max)
,nvarchar(max)
或varbinary(max)
数据types来存储大量数据。 要控制这些数据types的行内和行外行为,请使用large value types out of row
选项的large value types out of row
。
在SQL Server 2005中引入了新的数据types: varchar(max)
和nvarchar(max)
它们具有旧文本types的优点:它们可以包含op到2GB的数据,但是它们也具有varchar
和nvarchar
大部分优点。 其中的优点是能够使用string操作函数,如substring()。
此外,varchar(max)存储在表(磁盘/内存)空间中,而大小低于8Kb。 只有当你在现场放置更多的数据时,它才被存储在表格的空间之外。 存储在表空间中的数据(通常)更快地检索。
总之,不要使用文本,因为有更好的select:(n)varchar(max)。 而当一个常规的varchar不够大时,也就是说,如果你想要存储的string超过8000个字符,只能使用varchar(max)。
如上所述,您可以在TEXT数据types上使用SUBSTRING,但只要TEXT字段包含less于8000个字符。
ms 2008有一些重大变化 – >在决定使用什么数据types时,可能值得考虑下面的文章。 http://msdn.microsoft.com/en-us/library/ms143432.aspx
每个字节
- varchar(max),varbinary(max),xml,text或image列2 ^ 31-1 2 ^ 31-1
- nvarchar(最大)列2 ^ 30-1 2 ^ 30-1