为啥我们不主要使用 SQL_VARIANT 数据类型,即使它支持所有类型的数据? [复制]

Posted

技术标签:

【中文标题】为啥我们不主要使用 SQL_VARIANT 数据类型,即使它支持所有类型的数据? [复制]【英文标题】:Why we are not using SQL_VARIANT data type mostly, even though it supports all kind of data? [duplicate]为什么我们不主要使用 SQL_VARIANT 数据类型,即使它支持所有类型的数据? [复制] 【发布时间】:2014-08-11 12:13:44 【问题描述】:

SQL_VARIANT 数据类型可用于同时存储各种数据类型的值,例如数值、字符串和日期值。 (唯一不能存储的值类型是 TIMESTAMP 值。)那么在表中避免这种数据类型的具体原因是什么?

【问题讨论】:

您是否使用任何其他编程语言进行编程?您在那里使用各种数据类型还是将所有变量键入为object(或void * 或该语言中的任何道德等价物)?你想处理某人应该存储的事实吗?订单行项目中的项目数量,但存储了一首十四行诗? 这有帮助吗? ***.com/questions/9039455/… 是的,约翰。您分享的链接帮助我了解 SQL_Variant 参见Bad Habits to Kick: using the wrong datatype - 它有一个标题为完全使用 SQL_VARIANT - 不要使用 SQL_Variant - 这不是一个好选择 【参考方案1】:

SQL_VARIANT 的灵活性并不是免费的。您可以对变体字段执行的操作有一些限制。存储需求(您需要将类型与每行中的每个值一起存储)和计算复杂度(您需要在操作之前检查每个值的类型)都明显增加。

但即使在速度和存储不是问题的情况下,您也会获得更多的“维护责任”。代码的读者会花更多时间来了解可以在变量字段中存储什么样的内容,因为最终从数据库中读取的值最终会出现在代码中,并且您必须准备好处理任何类型的值.

这并不是否认存在使用SQL_VARIANT 的合法案例。这些案例是相当具体的,也是有限的。大多数情况下,要求之一是您的程序充当进出变量字段的数据的“管道”,而无需解释其中的内容。

【讨论】:

我最近从 Itzik Ben-Gan 那里学到的一个好技巧是在 CASE 表达式的 ELSE 分支中使用 CONVERT(SQL_VARIANT, NULL)。很快就会写博客。 @Aaron Bertrand:我在这里找到了你的帖子:sentryone.com/blog/aaronbertrand/sql-variant-use-case(确实很有用)

以上是关于为啥我们不主要使用 SQL_VARIANT 数据类型,即使它支持所有类型的数据? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

mssql sqlserver 数据类型sql_variant简介说明

如何存储抽象类型的数据?将数据存储为 sql_variant 数据类型是不是明智?

数据库异常信息为啥没有写入log4j日志文件中

为啥我们使用内部类?

使用 Objective-C/Swift 单例模型,为啥我们要创建共享实例而不只是使用类方法? [复制]

为啥写作主要;在 C 中给出一个段错误