在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,'>=','<')

SQLSERVER binary 和 varbinary 用法全解相关推荐

  1. c语言0x00如何不截断_binary 和 varbinary 用法全解

    在SQL Server中,使用数据类型 binary(n) 和 varbinary(n) 存储二进制数据,n是指字节数量: binary(n):固定长度为 n 字节,其中 n 值从 1 到 8,000 ...

  2. mysql中varbinary什么意思_MySQL中的数据类型binary和varbinary详解

    前言 BINARY和VARBINARY与 CHAR和VARCHAR类型有点类似,不同的是BINARY和VARBINARY存储的是二进制的字符串,而非字符型字符串.也就是说,BINARY和VARBINA ...

  3. php mysql binary_varbinary 和 binary 用法全解

    在SQL Server中,使用数据类型 binary(n) 和 varbinary(n) 存储二进制数据,n是指字节数量:binary(n):固定长度为 n 字节,其中 n 值从 1 到 8,000 ...

  4. MySQL BIT、BINARY、VARBINARY、BLOB(二进制类型)

    MySQL 支持两类字符型数据:文本字符串和二进制字符串.上节<MySQL字符串类型>我们讲了文本字符串,这节我们来讲解二进制字符串. 二进制字符串类型有时候也直接被称为"二进制 ...

  5. 6、(二进制类型)BIT、BINARY、VARBINARY、BLOB

    MySQL 支持两类字符型数据:文本字符串和二进制字符串. 二进制字符串类型有时候也直接被称为"二进制类型". MySQL 中的二进制字符串有 BIT.BINARY.VARBINA ...

  6. mysql binary blob区别_SQL中binary 和 varbinary的区别 blob

    binary 和 varbinary 固定长度 (binary) 的或可变长度 (varbinary) 的 binary 数据类型. binary [ ( n ) ] 固定长度的 n 个字节二进制数据 ...

  7. SQL中binary 和 varbinary的区别

    binary 和 varbinary 固定长度 (binary) 的或可变长度 (varbinary) 的 binary 数据类型. binary [ ( n ) ] 固定长度的 n 个字节二进制数据 ...

  8. mysql char 二进制_SQL:char 和 varchar、binary 和 varbinary、二进制字符串、严格模式、汉字编码方式...

    一.char 和 varchar 区别 1.定长和变成 char:定长,长度固定:varchar:变长,长度可变: 当插入的字符串长度小于定义长度时,则会以不同的方式来处理,如char(10),表示存 ...

  9. CSS样式设置语法全解,样式优先级、值和单位、字体、文本、块级元素,行内元素,替换元素、非替换元素、display、float、position、table、li、光标、边距边框、轮廓、颜色背景

    全栈工程师开发手册 (作者:栾鹏) 一个demo学会css css选择器全解 css操作语法全解 CSS样式设置语法全解: 样式优先级 1. !important标记的样式 > 内联样式(sty ...

最新文章

  1. Unity 2D游戏开发教程之游戏中精灵的跳跃状态
  2. 一仅仅小蜜蜂(杭电2044)
  3. Google上面关于cas的文章
  4. sqlserver可视化工具_数据分析之基础分析工具篇(修订版)
  5. 【MySQL 5.7 】从库1032 报错处理
  6. 20190811:只出现一次的数字(四种解法)
  7. [转]教你如何在博客园放“可运行代码
  8. AFM测试探针简介-科学指南针
  9. go语言复数包_复数 | Go语言圣经
  10. RK3399外设驱动之PWM驱动:红外驱动
  11. 腾讯三面:Cookie的SameSite了解吧,那SameParty呢?
  12. VMware虚拟机优化,提高虚拟机运行速度的方法?
  13. 动态规划——最大连续子序列和
  14. Redis从入门到入坟系列文章(一): keys 命令
  15. java 8 把list中对象的属性转成list
  16. geany配置html5,Geany的教程
  17. Android Jetpack中CameraX保存Bitmap
  18. Qt之九宫格图片处理
  19. UCOSii和Linux的区别和联系
  20. OpenGL学习-球体和phong光照模型

热门文章

  1. 网上测试眼镜的软件,测脸型配眼镜app
  2. PNAS:快速脑电波振荡识别并定位癫痫患者的大脑
  3. c#连接西门子plc
  4. 【STM32H7教程】第24章 STM32H7的Cache解读(非常重要)
  5. 自制atmega328p-pu为主控的Arduino核心板
  6. 零基础JavaScript-DOM入门(第一天)(第二天)
  7. protocol buffer namespace conflict
  8. 我的世界java版如何看坐标_坐标 - Minecraft Wiki,最详细的官方我的世界百科
  9. 我的择偶标准(丫咧,看清楚了啊)
  10. 擦地机器人排行榜_拖地机器人哪个牌子好?拖地机器人排行榜