• binary 和 varbinary 用法全解


    在SQL Server中,使用数据类型 binary(n) 和 varbinary(n) 存储二进制数据,n是指字节数量:

    • binary(n):固定长度为 n 字节,其中 n 值从 1 到 8,000 ,存储空间为 n 字节;
    • varbinary( n | max):可变长度,n 的取值范围为 1 至 8,000,max 是指最大存储空间是 2^31-1 个字节,即最大4GB;
    • n:在表列定义或变量声明语句中没有指定 n,则默认长度为 1;在CAST 函数中没有指定 n,则默认长度为 30;

    在将数据转换为二进制数据时,SQL Server会对生成的二进制数据进行填充或截断,详细的规则是:

    • 填充(或扩展)的二进制数据是16进制的0x00的整数倍,这就是说,填充的字节中每一个bit都是0;
    • 将字符类型转换成二进制数据时,在数据的右侧填充或截断数据,填充数值是0x00;
    • 将其他类型数据转换成二进制数据时,在数据的左侧填充或截断数据,填充数值是0x00;在截断数据时,保留低位的数据,将高位数值截断;

    一,初试binary类型定义二进制变量

    1,存储单位是Byte

    数据类型binary 和 varbinary 占用的存储空间的单位不是bit,而是 byte

    declare @varBi binary(1)
    set @varBi=1

    输出结果是:0x01,结果以16进制编码显示,共8bit。

    2,为binary变量赋值

    可以使用10进制数据为binary类型的变量赋值,也可以直接使用16进制数值为binary变量赋值;

    declare @biA binary(1)
    set @biA= 0x01

    二,二进制数据的类型转换

    1, 数值类型隐式转换成binary类型

    系统自动将 int类型隐式转换成binary类型,但是,binary必须显式强制转换成int类型。

    declare @varBi binary(1)
    set @varBi=1
    select @varBi,cast(@varbi as int)

    2, 字符类型不能隐式转换成binary类型,需要显式转换

    将字符类型转换成binary类型的过程是:逐个将字符的ASCII码转换成二进制数据,末尾补0,或截断末尾多余的字符

    declare @varBi binary(8)
    set @varBi=cast('1h' as binary(8))
    select @varBi,ascii('1'),ascii('h'),cast(@varbi as varchar),DATALENGTH(cast(@varbi as varchar))

    输出结果分析:

    • 0x31 是16进制,换算成10进制数值是49,和字符“1”的ASCII值相同;
    • 0x68 是16进制,换算成10进制数值是104,和字符“h”的ASCII值相同;
    • 末尾补0:由于字符串的长度是2Byte,定长binary(8)的长度是8Byte,在binary(8) 类型的末尾补0,补齐8Byte;
    • 在将binary转换成字符类型时,输出结果是字符 “1h”,而不是数字,说明,按照ASCII将数值转换成字符;
    • 转换成字符串类型时,长度是8Byte,未显示的字符是不可打印的;

    三,将字符串转换成二进制类型

    从字符数据类型转换成binary或varbinary类型时,将在右侧发生截断或填充,填充的是16进制的0x00。当从字符类型(char、varchar、nchar、nvarchar)转换为不同长度的 binary 或 varbinary 数据类型时,SQL Server 将在二进制数据的右侧填充或截断数据。从字符串的左边逐字节转换,如果字符串的长度大于binary的长度,则右边截断;如果字符串的长度小于binary的长度,则右边填充0x00;

    1,转换成binary或varbinary类型时,从数据的右侧截断数据 

    declare @varBi binary(2)
    set @varBi=cast('123' as binary(3))
    select @varBi,cast(@varbi as varchar)

    2,转换成binary或varbinary类型时,从数据的右侧填充数据,填充的数值是0x00

    declare @varBi binary(8)
    set @varBi=cast('123' as binary(8))
    select @varBi,cast(@varbi as varchar)

    四,将整数类型转换为二进制类型

    从整数类型转换为 binary 或 varbinary 时,在数据的左侧填充或截断数据,填充将通过使用十六进制的零来完成。

    1,从整数类型转换为二进制类型时,在数据的左侧截断数据,即保留低位的数据,将高位数值截断

    declare @biToInt binary(1)
    set @biToInt=300
    select @biToInt,cast(@biToInt as int)

    分析:由于binary(1)是1Byte,最大值是255,发生上溢,左侧发生截断,舍弃左边高位数值 256,保留低位数值44

    2,从整数类型转换为二进制类型时,在数据的左侧填充数据,即在高位填充数值:0x00

    declare @biToInt binary(3)
    set @biToInt= 12
    select @biToInt,cast(@biToInt as int)

    如果没有发生溢出,那么不管int类型数值有多大,都能生成相同的值,如果binary长度较长,那么左侧填充为0x00。

    五,二进制数据的比较,将自动提升操作数的数据类型

    在SQL Server中,字节大的二进制数据类型,其类型处于“高”位。在进行二进制数值比较之前,首先匹配两个操作数的数据类型,将两个操作数提升为相同的数据类型,这体现在比较两个binary类型的变量时,将字节数低的数据类型提升,保持两个操作数的字节数相同。提升的字节使用0x00填充,并且是在右侧填充,这将增大binary的数值。

    1,自动提升数据类型,在右侧填充0x00

    declare @biA binary(1)
    declare @biB binary(2)
    set @biA=1
    set @biB=2
    select @biA,@biB,iif(@biA >= @biB,'>=','<')

    输出结果分析:在比较时,SQL Server将变量@biA 的数据类型提升为binary(2),在右侧填充1byte,变成0x0100,数值是256,所以比较的结果是 >=;

    如果变量@biB的值是257,那么输出的结果将是<,因为,@biA填充之后,是0x0100,比0x0101小;

    declare @biA varbinary(1)
    declare @biB varbinary(2)
    set @biA=1
    set @biB=257
    select @biA,@biB,iif(@biA >= @biB,'>=','<')

  • 相关阅读:
    浅析Java中 new 和不 new 对象的区别
    uniapp打包后提示本应用使用HBuilderX 3.1.12 或对应的cli版本编译,而手机端SDK版本是3.1.13,不匹配的版本可能造成应用异常的解决办法
    浅析端口被占用如何做、windows报错'telnet'不是内部或外部命令,也不是可运行的程序如何处理
    苹果审核不过出现"您的 App 包含 NSUserTrackingUsageDescription...."解决办法
    CSS知识点:text-align-last段落最后一行设置对齐方式、transform:rotateY()翻转
    [转]scrollHeight, clientHeight, offsetHeight的区别
    【转】CSS变量(自定义属性)实践指南
    【转】angular 自定义 component decorator
    【转】Angular 编译打包 & Docker发布
    Angular FormControl Example | Angular 9 FormControl (理解angular formControl)
  • 原文地址:https://www.cnblogs.com/zhengxingpeng/p/6688044.html
Copyright © 2020-2023  润新知