当数据从字符串数据类型(char、varchar、nchar、nvarchar、binary、varbinary、text、ntext 或 image)转换为不同长度的 binary 或 varbinary 数据类型时,Microsoft® SQL Server™ 将在数据的右边进行填充或截断。当其它数据类型转换为 binary 或 varbinary 时,将在数据左边进行填充或截断。填充是使用十六进制的零来完成的。
如果二进制数据是移动数据的最容易的方式,则将数据转换为 binary 和 varbinary 数据类型对于数据移动很有用。对于任何类型的任何值,将该值转换为足够大的二进制值,然后转换回原类型,如果是在同一 SQL Server 版本上进行这两种转换,则始终导致相同的值。值的二进制表示法可能在 SQL Server 的版本间有所变更。
因为存储表达的改变,在 money、datetime、smalldatetime 和 numeric 数据类型和 binary 或 varbinary 之间的转换与早期版本的 SQL Server 有所不同。
可以将 int、smallint 和 tinyint 转换到 binary 或者 varbinary,但是如果将 binary 数据转回到整型数据,如果发生截断的话,将会得到与原来不同的整型数值。例如,下面这个 SELECT 语句显示整型数据通常是以二进制 0x0001e240 存储的:
SELECT CAST( 123456 AS BINARY(4) )
本 SELECT 语句显示如果这个二进制目标太小,不能保存整个数值,那么前导位就会被静默地截断,这样该数字就被存为 0xe240:
SELECT CAST( 123456 AS BINARY(2) )
本批处理显示这种静默截断会影响算术操作却不产生错误:
DECLARE @BinaryVariable2 BINARY(2)
SET @BinaryVariable2 = 123456
SET @BinaryVariable2 = @BinaryVariable2 + 1
SELECT CAST( @BinaryVariable2 AS INT)
GO
最终结果为 57921,而不是 123457。
说明 在 SQL Server 各个版本中,并不保证任何数据类型和 binary 数据类型之间的转换是一致的。