在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;在截断数据时,保留低位的数据,将高位数值截断;

一,二进制类型的特征

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

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

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

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

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

字节流的逆序,可以使用reverse()函数对字节流进行逆序排列:

  1. declare @bi varbinary(max)=123456
  2. select @bi, cast(reverse(@bi) as varbinary(max))
  3. --0x0001E240 0x40E20100

二,类型转换

由于数据都是用字节存储,二进制类型可以和所有其他类型的数据进行转换。

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

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

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

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

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

  1. declare @varBi binary(8)
  2. set @varBi=cast('1h' as binary(8))
  3. select @varBi,ascii(''),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,未显示的字符是不可打印的;

三,将字符串翻译(translate)成二进制类型

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

翻译的字符必须是0-9、a-f,逐个把字符的ASCII码翻译成二进制数字,或者逐个把二进制数字对应ASCII码,转换为字符。默认情况下,对于二进制数据,0x是自动填充导结果的最左侧。

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

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

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

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

3,使用convert的风格0(style=0)把binary(或varbinary)翻译成字符串

  1. select convert(varchar(8), 0x4E616d65, 0),cast(0x4E616d65 as varchar(8))

4,使用convert的风格0(style=0)把字符串翻译成binary(或varbinary)

  1. select convert(varbinary(8), 'name', 0),cast('name' as varbinary(8))

四,使用convert进行字符串和binary(或varbinary)的转换

如果要把二进制数据,按照显示的字符转换为字符串,那么就必须使用convert转换,convert的第三个参数是style,共有两种风格,分别是1 和 2,风格1要求0x必须在二进制数据的最左侧,风格2要求0x不能出现在二进制数据的最左侧。

1,使用convert把binary转换为字符串

分别设置style是1和2,查看转换的结果:当style为1时,字符串前面添加0x;当style为2时,字符串前面没有0x;

  1. declare @b binary(8)
  2. set @b=12
  3. select convert(varchar(64),@b,1),convert(varchar(64),@b,2)

2,使用convert把字符串转换为binary类型

如果字符串前面有0x字符,那么使用风格1(设置style=1);如果字符串前面没有0x字符,那么使用风格2(设置style=2);

  1. declare @c varchar(64),@d varchar(64)
  2. select @c='0x000000000000000C',@d='000000000000000C'
  3. select convert(binary(8),@c,1), convert(binary(8),@d,2)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

参考文档:

binary and varbinary (Transact-SQL)

binary 和 varbinary 用法的更多相关文章

  1. SQL中binary 和 varbinary的区别 blob

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

  2. BINARY and varBINARY

    BINARY(n) ,varBINARY(n): N代表字节数 utf8: mysql> CREATE TABLE t (c BINARY()); Query OK, rows affected ...

  3. binary 和 varbinary 用法全解

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

  4. Razor视图引擎布局 Razor视图引擎的基本概念与法语 SQL Server Mobile 和 .NET 数据访问接口之间的数据类型映射 binary 和 varbinary datetime 和 smalldatetime float 和 real

    Razor视图引擎布局   不需要像过去aspx一样,使用.Master文件,而是统一使用.cshtml 或 .vbhtml文件.但文件名一般以 _开头,这样做文件不会当做View显示出来 使用@Re ...

  5. binary 和 varbinary

    固定长度或可变长度的 Binary 数据类型. binary [ ( n ) ] 长度为 n 字节的固定长度二进制数据,其中 n 是从 1 到 8,000 的值.存储大小为 n 字节. varbina ...

  6. The BINARY and VARBINARY Types

    mysql> CREATE TABLE t (c BINARY()); Query OK, rows affected (0.21 sec) mysql> INSERT INTO t SE ...

  7. mysql中varbinary、binary、char、varchar异同

    binary 与 varbinary 类型和char与varchar类型是相似的,只是他们存储的是二进制数据,也就是说他们是包含字节流而不是字符流,他们有二进制字符的集合和顺序,他们的对比,排序是基于 ...

  8. 【转】mysql 拖库写库用法

    mysqldump常用于MySQL数据库逻辑备份. 1.各种用法说明 A. 最简单的用法: mysqldump -uroot -pPassword [database name] > [dump ...

  9. SQL中CONVERT()函数用法详解

    SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...

随机推荐

  1. 获取基于Internet Explorer_Server的聊天窗口内容

    假设在得到窗体中控件的句柄(通过SPY++)的前提下,如果是像文本框这种控件,只要用SendMessage就可得到文本了,但是对于聊天记录窗口却行不通(返回空值),因为那其实是一个内置浏览器Inter ...

  2. 关于纯移动web优点的一点思考

    自己造个小概念,纯移动web就是手机浏览器上访问的网站^_^ 缺点就不说了,说几个随着硬件和网络发展会放大的优势. 1 相对app来说,完全无缝对接,只要符合html标准,一次开发全平台部署 2 推广 ...

  3. 日常工作中的点滴:C# 根据字节长度截包含中文的字符串

    方法中利用正则表达式判断某个字符是否是中文 public string SubStringB(string text,int length){ int target=0; int b=0; for(i ...

  4. web攻防

    1.内网渗透端口转发: 在被控制机上执行: lcx.exe -slave 216.32.*.*(一个外网ip) 51  192.168.2.32(内网ip)  端口号 在本机上执行: lcx.exe ...

  5. 一个简单的python线程池框架

    初学python,实现了一个简单的线程池框架,线程池中除Wokers(工作线程)外,还单独创建了一个日志线程,用于日志的输出.线程间采用Queue方式进行通信. 代码如下:(不足之处,还请高手指正) ...

  6. 关于IDW空间插值

    空间插值一般都会用到IInterPolationOP接口等 首先是通过图层的名称获取图层的方法: private ILayer GetLayerByName(string name)        { ...

  7. 12G服务器在BIOS中收集阵列卡日志(TTY日志)的方法

      如果系统进不去.请参考如下方法收集日志. 请准备个U 盘,容量在8G以下(含8G),否则会识别不到. 图片参考,以描述为准 F2 enter BIOS option--> Enter the ...

  8. 快速学习C语言三: 开发环境, VIM配置, TCP基础,Linux开发基础,Socket开发基础

    上次学了一些C开发相关的工具,这次再配置一下VIM,让开发过程更爽一些. 另外再学一些linux下网络开发的基础,好多人学C也是为了做网络开发. 开发环境 首先得有个Linux环境,有时候家里机器是W ...

  9. .Net Core CLI windows安装

    下载官方的msi安装包official MSI installer双击安装就可以了. 默认会安装到C:\Program Files\dotnet\目录下,如果找不到可以用命令 where dotnet ...

  10. C#版的eval,C#Light开源嵌入式脚本,unity热更新不再愁

    目前最新版本AlphaV0.06 完全的c#语法,可用于一切能运行C#的场合,wp windows xamarin mono asp.net unity3d 内嵌了int uint bool stri ...