我有可变长度字符数据并希望存储在 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 这里不是一种常数, VARCHARVARCHAR(MAX) 是非常不同的类型,后者非常接近 TEXT.

在之前的版本中 SQL服务器 您无法访问 TEXT 直接,你只能得到一个 TEXTPTR 并用在 READTEXTWRITETEXT 功能。

SQL Server 2005 你可以直接访问 TEXT 列(尽管您仍然需要显式转换 VARCHAR 为它们分配一个值)。

TEXT 很好:

  • 如果您需要在数据库中存储大文本
  • 如果您不搜索列的值
  • 如果你很少选择这个栏目并且不加入它。

VARCHAR 很好:

  • 如果你存储小字符串
  • 如果您搜索字符串值
  • 如果您始终选择它或在连接中使用它。

经过 选择 这里我的意思是发出返回列值的任何查询。

经过 寻找 这里我的意思是发出任何查询,其结果取决于 TEXT 或者 VARCHAR 柱子。这包括在任何 JOIN 或者 WHERE 健康)状况。

作为 TEXT 存储在行外,查询不涉及 TEXT 列通常更快。

一些例子说明什么 TEXT 适合:

  • 博客评论
  • 维基页面
  • 代码来源

一些例子说明什么 VARCHAR 适合:

  • 用户名
  • 页面标题
  • 文件名

根据经验,如果您需要文本值超过 200 人物 不要在此列上使用 join,请使用 TEXT.

否则使用 VARCHAR.

附: 这同样适用于 UNICODE 已启用 NTEXTNVARCHAR 同样,您应该将其用于上面的示例。

附言 这同样适用于 VARCHAR(MAX)NVARCHAR(MAX)SQL Server 2005+ 使用而不是 TEXTNTEXT. 。您需要启用 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的数据,但他们也有大部分的varcharnvarchar的优势。在这些优点是使用字符串操作的功能,例如子的能力()。

另外,VARCHAR(max)存储在表的(磁盘/内存)空间,而尺寸小于的8Kb。只有当你在野外放置更多的数据,它存储了表的空间。存储在表的空间的数据(通常)检索速度更快。

在短,从不使用文本,因为有一个更好的选择:(n)的VARCHAR(最大值)。只有使用VARCHAR(最大值)时,常规的varchar不够大,也就是说,如果你想到你要存放将超过8000个字符的字符串德

正如所指出的,可以在text数据类型使用SUBSTRING,但只作为长的文本字段包含少于8000个字符。

ms 2008 中发生了一些重大变化 -> 在决定使用哪种数据类型时可能值得考虑以下文章。http://msdn.microsoft.com/en-us/library/ms143432.aspx

每字节数

  1. varchar(max)、varbinary(max)、xml、文本或图像列 2^31-1 2^31-1
  2. nvarchar(max) 列 2^30-1 2^30-1
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top