我有可变长度的字符数据并希望存储在 SQL Server (2005) 数据库中。我想学习一些关于如何选择 TEXT SQL 类型或选择 VARCHAR SQL 类型的最佳实践,以及性能/足迹/功能方面的优缺点。
4 回答
TEXT
用于大块字符串数据。如果字段的长度超过某个阈值,则文本存储在行外。
VARCHAR
始终存储在行中,并且限制为8000 个字符。如果您尝试创建 a VARCHAR(x)
,其中x > 8000,则会出现错误:
服务器:消息 131,级别 15,状态 3,第 1 行
赋予类型 'varchar' 的大小 () 超过任何数据类型允许的最大值 (8000)
这些长度限制VARCHAR(MAX)
在SQL Server 2005中不涉及,它可能存储在行外,就像TEXT
.
请注意,MAX
这里不是一种常量,VARCHAR
而是VARCHAR(MAX)
非常不同的类型,后者非常接近TEXT
.
在SQL Server的早期版本中,您无法TEXT
直接访问,您只能获取 a并在和函数TEXTPTR
中使用它。READTEXT
WRITETEXT
在SQL Server 2005中,您可以直接访问TEXT
列(尽管您仍然需要显式强制转换VARCHAR
来为它们分配值)。
TEXT
很好:
- 如果您需要在数据库中存储大文本
- 如果您不搜索列的值
- 如果您很少选择此列并且不加入它。
VARCHAR
很好:
- 如果你存储小字符串
- 如果您搜索字符串值
- 如果您总是选择它或在连接中使用它。
通过选择此处,我的意思是发出任何返回列值的查询。
通过在这里搜索,我的意思是发出任何查询,其结果取决于TEXT
orVARCHAR
列的值。这包括在任何情况下使用JOIN
它WHERE
。
由于TEXT
存储在行外,不涉及TEXT
列的查询通常更快。
TEXT
有什么好处的一些例子:
- 博客评论
- 维基页面
- 代码源
VARCHAR
有什么好处的一些例子:
- 用户名
- 页面标题
- 文件名
根据经验,如果您需要超过200 个字符的文本值并且不要在此列上使用连接,请使用TEXT
.
否则使用VARCHAR
.
PS这同样适用于UNICODE
enabledNTEXT
和NVARCHAR
,您应该在上面的示例中使用它。
PPS这同样适用于SQL Server 2005+使用VARCHAR(MAX)
andNVARCHAR(MAX)
而不是and 。如果您希望它们始终存储在行外,则需要为它们启用。TEXT
NTEXT
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
选项。
如果您使用的是 SQL Server 2005 或更高版本,请使用varchar(MAX)
. 该text
数据类型已弃用,不应用于新的开发工作。从文档:
重要的
ntext
、text
和image
数据类型将在 Microsoft SQL Server 的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用nvarchar(max)、varchar(max)和varbinary(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 个字符。
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