【问题标题】:varchar(max): how to control the length of "in row" datavarchar(max):如何控制“行内”数据的长度
【发布时间】:2015-11-23 14:56:42
【问题描述】:

我一直在读这样的东西:

在 SQL 的未来版本中将删除 text in row 选项 服务器。避免在新的开发工作中使用此选项,并计划 修改当前在行中使用文本的应用程序。我们建议 使用 varchar(max)、nvarchar(max) 或 varbinary(max) 数据类型。控制行内和行外行为 在这些数据类型中,请使用大值类型 out of row 选项。

如果我们有一个 varchar(max) 字段,我们希望限制为 16 个字符,我们该怎么办?

谢谢!

编辑。当我说“行内”时,我的意思是 VARCHAR/TEXT 字符串直接存储在数据行中,而不是作为指针(字符串数据存储在其他地方)。如果移出行的数据不是“where”子句的一部分,则行外数据将提高表扫描性能。

编辑。我引用的文字是这样说的:

控制行内和行外行为 在这些数据类型中,请使用大值类型 out of row 选项。

果然:

https://msdn.microsoft.com/en-us/library/ms173530.aspx

但是在那个页面上是这样写的:

在未来版本的 SQL 中将删除行中文本功能 服务器。要存储大值数据,我们建议您使用 varchar(max)、nvarchar(max) 和 varbinary(max) 数据类型。

所以问题仍然存在。

编辑。看来我们仍然可以使用此表选项:

大值类型超出行数。值 1 表示 varbinary(max), xml 和表中的大型用户定义类型 (UDT) 列被存储出来 行,带有指向根的 16 字节指针。值为 0 表示 varchar(max)、nvarchar(max)、varbinary(max)、xml 和大 UDT 值 直接存储在数据行中,最大为 8000 字节,并且 只要该值可以放入记录中。如果值不合适 在记录中,指针存储在行内,其余的存储在行外 LOB 存储空间中的行数。 0 是默认值。

但是,当数据较小时,我们似乎失去了将数据保留在行中的选项。要么全进要么全出。有没有其他方法可以做到这一点?

【问题讨论】:

  • "in row" 是指存储在行中的字节数。如果数据大于 16,那么它将被存储在行外。
  • 好吧,就我个人而言,我从不使用 VARCHAR(MAX),因为它不能作为索引等等。为什么不使用 VARCHAR(8000)?
  • 1) 该字段永远不会被索引。 2)我想保持行大小尽可能小。此文本数据很少被查询。 varchar(8000) 会将所有文本保持在行中。较大的行 = 较慢的正常查询。
  • @johnnycrash 我认为您误解了问题中包含的文档。在这两个选项中,一个始终是行外的,另一个模拟以前的行为。它并不像你想象的那样总是在或总是在外面。
  • 什么选项可以让我们设置字符数限制。超过该计数,数据存储在行外。低于或等于该计数的数据存储在行中。

标签: tsql varcharmax


【解决方案1】:

你是对的,没有配置可以像旧的“TEXT_IN_ROW”一样做。

您可以让 SQL Server 在页面中最多存储 8Kb,或者将任意大小的信息存储在行外。

【讨论】:

    【解决方案2】:

    如果我们有一个我们想要的 varchar(max) 字段,我们应该怎么做 一行限制为 16 个字符?

    CREATE TABLE dbo.T1 (SomeCol VARCHAR(MAX) CHECK (LEN(SomeCol)<=16));
    

    【讨论】:

      猜你喜欢
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多