SQL Server 文本类型对比varchar数据类型[关闭]
-
05-09-2019 - |
题
我有可变长度字符数据并希望存储在 SQL Server (2005) 数据库中。我想了解一些关于如何选择 TEXT SQL 类型或选择 VARCHAR SQL 类型的最佳实践,以及性能/占用空间/功能方面的优缺点。
解决方案
如果您使用的是 SQL Server 2005 或更高版本,请使用 varchar(MAX)
. 。这 text
数据类型已弃用,不应用于新的开发工作。从 文档:
重要的
ntext
,text
, , 和image
Microsoft SQL Server 的未来版本中将删除数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。使用 nvarchar(最大), varchar(最大), , 和 varbinary(最大) 反而。
其他提示
TEXT
用于大块字符串数据。如果字段的长度超过某个阈值,则文本将存储在行外。
VARCHAR
总是存储在行中并且有一个限制 8000 人物。如果您尝试创建一个 VARCHAR(x)
, , 在哪里 x > 8000, ,你会得到一个错误:
服务器:消息 131,第 15 级,状态 3,第 1 行
赋予类型“varchar”的大小 () 超出了任何数据类型允许的最大值 (8000)
这些长度限制不涉及 VARCHAR(MAX)
在 SQL Server 2005, ,它可以存储在行外,就像 TEXT
.
注意 MAX
这里不是一种常数, VARCHAR
和 VARCHAR(MAX)
是非常不同的类型,后者非常接近 TEXT
.
在之前的版本中 SQL服务器 您无法访问 TEXT
直接,你只能得到一个 TEXTPTR
并用在 READTEXT
和 WRITETEXT
功能。
在 SQL Server 2005 你可以直接访问 TEXT
列(尽管您仍然需要显式转换 VARCHAR
为它们分配一个值)。
TEXT
很好:
- 如果您需要在数据库中存储大文本
- 如果您不搜索列的值
- 如果你很少选择这个栏目并且不加入它。
VARCHAR
很好:
- 如果你存储小字符串
- 如果您搜索字符串值
- 如果您始终选择它或在连接中使用它。
经过 选择 这里我的意思是发出返回列值的任何查询。
经过 寻找 这里我的意思是发出任何查询,其结果取决于 TEXT
或者 VARCHAR
柱子。这包括在任何 JOIN
或者 WHERE
健康)状况。
作为 TEXT
存储在行外,查询不涉及 TEXT
列通常更快。
一些例子说明什么 TEXT
适合:
- 博客评论
- 维基页面
- 代码来源
一些例子说明什么 VARCHAR
适合:
- 用户名
- 页面标题
- 文件名
根据经验,如果您需要文本值超过 200 人物 和 不要在此列上使用 join,请使用 TEXT
.
否则使用 VARCHAR
.
附: 这同样适用于 UNICODE
已启用 NTEXT
和 NVARCHAR
同样,您应该将其用于上面的示例。
附言 这同样适用于 VARCHAR(MAX)
和 NVARCHAR(MAX)
那 SQL Server 2005+ 使用而不是 TEXT
和 NTEXT
. 。您需要启用 large value types out of row
对他们来说 sp_tableoption
如果您希望它们始终存储在行外。
正如上面提到的和 这里, TEXT
将在未来版本中弃用:
这
text in row
选项将在未来版本中删除 SQL服务器. 。避免在新的开发工作中使用此选项,并计划修改当前使用的应用程序text in row
. 。我们建议您使用以下方式存储大数据varchar(max)
,nvarchar(max)
, , 或者varbinary(max)
数据类型。要控制这些数据类型的行内和行外行为,请使用large value types out of row
选项。
在SQL服务器进行了介绍2005年的新数据类型:varchar(max)
和nvarchar(max)
他们有旧的文本类型的优点:它们可以包含运到2GB的数据,但他们也有大部分的varchar
和nvarchar
的优势。在这些优点是使用字符串操作的功能,例如子的能力()。
另外,VARCHAR(max)存储在表的(磁盘/内存)空间,而尺寸小于的8Kb。只有当你在野外放置更多的数据,它存储了表的空间。存储在表的空间的数据(通常)检索速度更快。
在短,从不使用文本,因为有一个更好的选择:(n)的VARCHAR(最大值)。只有使用VARCHAR(最大值)时,常规的varchar不够大,也就是说,如果你想到你要存放将超过8000个字符的字符串德
正如所指出的,可以在text数据类型使用SUBSTRING,但只作为长的文本字段包含少于8000个字符。
ms 2008 中发生了一些重大变化 -> 在决定使用哪种数据类型时可能值得考虑以下文章。http://msdn.microsoft.com/en-us/library/ms143432.aspx
每字节数
- varchar(max)、varbinary(max)、xml、文本或图像列 2^31-1 2^31-1
- nvarchar(max) 列 2^30-1 2^30-1