【问题标题】:Why does SQL Server Image data type have max_length set to 16 in sys.all_columns为什么 SQL Server Image 数据类型在 sys.all_columns 中将 max_length 设置为 16
【发布时间】:2021-10-21 04:27:27
【问题描述】:

通过SYS.all_columns查看SQL Server中的列定义时,发现image数据类型的max_length设置为16,谁能帮忙解释一下这是什么意思?

【问题讨论】:

  • "ntext、text 和 image 数据类型将在 SQL Server 的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。" - docs.microsoft.com/en-us/sql/t-sql/data-types/…
  • 它是指向 LOB 值的指针的大小。但谁在乎?就像米奇说的,你应该在 20 年前就停止使用这种类型。请阅读:sqlperformance.com/2021/07/sql-performance/…
  • 许多考虑image 数据类型的人是SQL Server 的新手,可能希望将图片存储在数据库中。首先...不要那样做(将图片的引用存储在数据库中,但将图片内容在线存储或存储在文件系统中)。但是,如果您绝对必须将它们存储在数据库中,请改用 varbinary(max) 数据类型。
  • 谢谢大家。是的,绝对应该避免在新项目中使用图像。我正在查看一个几年前构建的系统,并跨过这 16 个 max_length 来获取图像数据类型。 @AaronBertrand,感谢您指出 16 个字节的指针长度。

标签: sql-server metadata


【解决方案1】:

你看到的 16 不是指 data 的最大大小,它指的是 pointer 指向 LOB 值的大小(默认为存储在行外)。

documentation for sys.columns 提到了 16 个字节,但没有很好地解释原因(它只说它适用于 text,但实际上它适用于 textntextimage) .我最近提交了一个 PR 来说明这一点,it was approved(应该在下周左右发布)。

the TEXTPTR topic 上有一个更好的小信息块,其中一个示例说:

返回 16 字节的文本指针

请注意,自 SQL Server 2005 发布 16 年多以来,documentation for image 已收到此警告:

重要!在 SQL Server 的未来版本中将删除 ntext、text 和 image 数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用 nvarchar(max)、varchar(max) 和 varbinary(max)。

就在几个月前,我还在博客上写过这篇文章:

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2012-10-12
    相关资源
    最近更新 更多