mysql varbinary max_binary 和 varbinary 用法全解

mysql varbinary max_binary 和 varbinary 用法全解在 SQLServer 中 使用数据类型 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 在表列定

在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

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

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

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

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

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

declare @bi varbinary(max)=

select @bi, cast(reverse(@bi) as varbinary(max))–0x0001E240 0x40E20100

二,类型转换

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

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))

5529b027dff777db6fbdfc261e21d3d5.png

输出结果分析:

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类型时,从数据的右侧截断数据

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

a657ba494598496d96931c489e00cbfa.png

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

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

8389f6fa7fad654d53b8aba5395f1e52.png

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

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

13f2549f44df7cc5c0c6e436f2a184ce.png

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

select convert(varbinary(8), ‘name’, 0),cast(‘name’ as varbinary(8))

727ef131e1422ddc002c31efa0d3fb5f.png

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

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

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

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

declare @b binary(8)set @b=12

select convert(varchar(64),@b,1),convert(varchar(64),@b,2)

5d87d9c2bbc317995f12abcb8472a173.png

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

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

declare @c varchar(64),@d varchar(64)select @c=’0x000000000000000C’,@d=’000000000000000C’

select convert(binary(8),@c,1), convert(binary(8),@d,2)

5b7104f36a7cbe085aef1182b25c1046.png

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

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

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

declare @biToInt binary(1)set @biToInt=300

select @biToInt,cast(@biToInt as int)

4246ece69e34a8615f46766327fdd630.png

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

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

declare @biToInt binary(3)set @biToInt= 12

select @biToInt,cast(@biToInt as int)

c5ecdd5c33b432252fdc9dc1ee065ea4.png

如果没有发生溢出,那么不管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,’>=’,’

d81e33f9e9801af850ed5f8537d9a1aa.png

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

如果变量@biB的值是257,那么输出的结果将是

declare @biA varbinary(1)declare @biB varbinary(2)set @biA=1

set @biB=257

select @biA,@biB,iif(@biA >= @biB,’>=’,’

5b872265b23e0f72688a35356dfc928c.png

参考文档:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199848.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 下午12:04
下一篇 2026年3月20日 下午12:04


相关推荐

  • python激活成功教程qq密码_央·python编程之QQ数据清洗

    python激活成功教程qq密码_央·python编程之QQ数据清洗一般我们从网上下下来的数据都很杂乱的,什么样的情况都有,不利于我们整理,所以在拿到数据的时候我们会先做一遍数据清理,把垃圾数据清理掉。今天我们拿QQ数据做示范。我们命令行是怎么看数据![Asm]纯文本查看复制代码morezy.txt#然后空格进行翻页效果如图:1.png(11.5KB,下载次数:0)2018-1-3017:54上传从数据中得知:—-中间4个-左边是账号,右边…

    2022年7月20日
    23
  • Coze自动化工作流+Agent智能体实战教程(0基础入门,附多场景实操)

    Coze自动化工作流+Agent智能体实战教程(0基础入门,附多场景实操)

    2026年3月16日
    4
  • UVA10765-Doves and bombs(BCC)

    UVA10765-Doves and bombs(BCC)

    2022年1月31日
    52
  • 3DSlicer三维重建

    3DSlicer三维重建三维重建

    2026年3月17日
    1
  • JAVA 三目运算符

    JAVA 三目运算符JAVA 三目运算符三目运算符格式案例三目运算符三目运算符 又称条件运算符 是计算机语言 c c java 等 的重要组成部分 它是唯一有 3 个操作数的运算符 所以有时又称为三元运算符 一般来说 三目运算符的结合性是右结合的 其实三目运算符可以看作是简写的 if 判断语句 格式比较表达式 表达式 1 表达式 2 根据比较表达式的计算返回一个 true 或者 false 如果是 true 就把表达式

    2026年3月19日
    3
  • 软件破解工具合集[通俗易懂]

    软件破解工具合集[通俗易懂][原文]调试工具(Debuggers)OllyDbg调试器OllyDbgv1.1一个新的动态追踪工具,将IDA与结合起来的思想,Ring3级调试器,非常容易上手,己代替SoftICE成为当今最为流行的调试解密工具了。强烈推荐!OllyICE.exe是在cao_cong汉化第二版基础上修改的。OLLYDBG.EXE英文修改版(是在forgo

    2022年5月12日
    105

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号