我们的部分应用程序代码将数据类型转换为BINARY
用于散列的目的。例如,我们将BIGINT
值转换为BINARY(8)
. 该文档警告说,SQL Server 版本之间的转换可能会发生变化:
不保证任何数据类型和二进制数据类型之间的转换在 SQL Server 版本之间是相同的。
作为一种防御,每当我们开始支持新版本的 SQL Server 时,我们都会尝试运行测试来验证我们所有的转换是否仍然有效。对于类似的东西BIGINT
,我们检查转换值的长度以获取允许的最小值和最大值BIGINT
。这有希望意味着我们会知道,例如,SQL Server 2019 是否开始要求BINARY(9)
适应BIGINT
.
我们如何进行这种类型的分析FLOAT(53)
呢?现在我们认为所有可能的值都映射到适合 a 的唯一值BINARY(8)
,但我不知道如何验证这一点。这可能不像只检查数据类型所需的字节数那么简单。例如,TIME
数据类型需要 5 个字节用于存储,但必须转换为 aBINARY(6)
以避免错误。也许这无关紧要,但也让我紧张BINARY
无法转换回FLOAT
. 我承认我可能想多了这个问题,所以我欢迎框架挑战作为答案。
如何编写代码来验证所有可能的输入FLOAT(53)
不会溢出 aBINARY(8)
并且两个不同FLOAT(53)
的值不会转换为相同的BINARY(8)
值?
记录了BIGINT和FLOAT(53)的大小(以字节为单位) 。使任何一个都不能来回转换为 BINARY(8) 将是一项重大更改。
您引用的文档是关于转换的详细信息,这些信息没有记录并且可能会发生变化。例如,此转换中 float(53) 的字节布局可能会发生变化。因此,如果将 float 转换为 binary(8),将 binary(8) 存储在表中,升级 SQL Server,然后将 binary(8) 转换回 float,则可能不会得到相同的值。
这些特定类型具有众所周知的字节布局。BIGINT 是一个 8 字节的小端整数,float(53) 是一个标准的双精度浮点数。如果其中之一发生了变化,那将是非常令人惊讶的。但是其他类型,尤其是基于 CLR 的类型,确实可能会在版本之间改变它们的布局。