binary 和 varbinary 用法

TSql中有binary 和 varbinary 这两种数据类型,用于存储二进制数据。

1, 语法,

binary  [ ( n ) ]
  长度为 n 字节的固定长度二进制数据,其中 n 是从 1 到 8,000 的值。存储大小为 n 字节。
varbinary  [ ( n | max) ]              
  可变长度二进制数据。 n 的取值范围为 1 至 8,000。 max   指示最大存储大小是 2^31-1 个字节。 存储大小为所输入数据的实际长度 + 2 个字节。 所输入数据的长度可以是 0 字节。

如果没有在数据定义或变量声明语句中指定 n,则默认长度为 1。  如果没有使用 CAST 函数指定 n,则默认长度为 30

MSDN上说,binary 和 varbinary 存储的单位并不是bit,而是 byte,示例如下

declare @varBi binary(1)

set @varBi=1

print @varBi

输出结果是:0x01

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

2,类型转换

2.1 int类型隐式转换成binary类型,int类型可以隐式转换成binary类型,binary可以通过 cast,convert 转换成int类型。

declare @varBi binary(1)

set @varBi=1

print @varBi

print cast(@varbi as int)

可以把binary转换成int类型,输出的结果是1

2.2 char类型不能隐式转换成binary类型,需要显式转换,通过 cast 和 convert 显式转换成 binary类型。

declare @varBi binary(8)
set @varBi=cast(‘1‘ as binary(8))

print @varBi
print cast(@varbi as varchar)

---- 0x3100000000000000
---- 1

输出结果是字符 “1”,而不是数字1,这说明binary是逐个字节转换的。0X31是16进制,代表的10进制数值是49,和“1”的ASCII值是相同的。
在0X31 有7个byte,都是使用0x00来填充。

2.3 从字符数据类型转换成binary或varbinary类型时,将在右侧发生截断或填充,填充将通过使用十六进制的零来完成。

当数据从字符串数据类型(char、varchar、nchar、nvarchar、binary、varbinary、text、ntext 或 image)转换为不同长度的 binary 或 varbinary 数据类型时,SQL Server 将在数据的右侧填充或截断数据。

从字符串的左边逐字节转换,如果字符串的长度大于binary的长度,则右边截断;如果字符串的长度小于binary的长度,则右边填充0x00;

declare @varBi binary(2)
set @varBi=cast(‘123‘ as binary(8))

print @varBi
print cast(@varbi as varchar)

---- 0x3132
---- 12
declare @varBi binary(8)
set @varBi=cast(‘123‘ as binary(8))

print @varBi
print cast(@varbi as varchar)

---- 0x3132330000000000
---- 123

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

可以将 int、smallint 和 tinyint 转换为 binary 或 varbinary,但是如果将 binary 转换回整数值,则在发生了截断的情况下此值将不同于原始整数值。

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

print @biToInt
print cast(@biToInt as int)

-- 0x2C
-- 44

由于binary(1)是8位bit,最多存储255,发生上溢,左侧发生截断,舍弃左边高位 数值 256,保留低位数值44

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

print @biToInt
print cast(@biToInt as int)

--0x00000C
--12

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

2.5 从其他数据类型(除了字符数据类型之外的)转换为 binary 或 varbinary 时,将在数据的左侧填充或截断数据。 填充将通过使用十六进制的零来完成。

如果 binary 数据是最容易来回移动的数据,则将数据转换为 binary 和 varbinary 数据类型很有用。  将任一类型的任一值转换为足够大的二进制值,然后转换回原类型时,如果两次转换都是在相同的 SQL Server 版本上进行的,将始终生成相同的值。 值的二进制表示形式在不同 SQL Server 版本之间可能会有所不同。

3 binary 类型的数据如何比较大小?

SQL进行数值比较之前,首先进行数据类型的匹配,将两个操作数的数据类型提升为相同数据类型。

binary的长度是十分重要的,在两个binary类型的变量之间进行比较时,会将位数低的数据类型提升,保持两个操作数的位数相同。

提升的位数使用0x00填充,并且是在右侧填充,这将增大binary的数值。

declare @biA binary(1)
declare @biB binary(2)

set @biA=1
set @biB=2

print @bia
print @bib

if @biA >= @biB
begin
    print ‘>=‘
end
else
    print ‘<‘

-- 0x01
-- 0x0002
-- >=

在比较时,@biA在右侧填充一个byte,变成0x0100,数值是256,所以比较的结果是 >=;如果set @biB=257,那么输出的结果将是<

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

set @biA=1
set @biB=257

print @bia
print @bib

if @biA >= @biB
begin
    print ‘>=‘
end
else
    print ‘<‘

-- 0x01
-- 0x0101
-- <

4,赋值,binary的存储单位是byte,可以直接使用16进制数值为binary变量赋值

declare @biA binary(1)

set @biA= 0x01

print @biA
时间: 2024-10-16 02:59:42

binary 和 varbinary 用法的相关文章

BINARY and varBINARY

BINARY(n) ,varBINARY(n): N代表字节数 utf8: mysql> CREATE TABLE t (c BINARY(3)); Query OK, 0 rows affected (0.04 sec) mysql> INSERT INTO t SET c = 'a'; Query OK, 1 row affected (0.19 sec) mysql> SELECT HEX(c), c = 'a', c = 'a\0\0' from t; +--------+---

BINARY 和 VARBINARY

(1) BINARY 和 VARBINARY 类型类似于 CHAR 和 VARCHAR,不同的是它们可以存储包含二进制字节的字符串 (2) BINARY类型的长度是固定的,指定长度之后,不足最大长度的,将在它们右边填充 '\0' 补齐以达到指定长度,例如,指定列数据类型为 BINARY(3),当插入 'a' 时,存储的内容实际为 "a\0\0",当插入 'ab' 时,实际存储的内容为 "ab\0",不管存储的内容是否达到指定的长度,其存储空间均为指定的值M. (3)

char、varchar、binary和varbinary的区别与联系

char使用固定长度的空间进行存储,char(4)存储4个字符,根据编码方式的不同占用不同的字节,gbk编码方式,不论是中文还是英文,每个字符占用2个字节的空间,utf8编码方式,每个字符占用3个字节的空间.如果需要存储的字符串的长度跟所有值的平均长度相差不大,适合用char,如MD5.对于经常改变的值,char优于varchar,原因是固定长度的行不容易产生碎片.对于很短的列,char优于varchar,原因是varchar需要额外一个或两个字节存储字符串的长度. varchar保存可变长度的

The BINARY and VARBINARY Types

mysql> CREATE TABLE t (c BINARY(3)); Query OK, 0 rows affected (0.21 sec) mysql> INSERT INTO t SET c = 'a'; Query OK, 1 row affected (0.18 sec) mysql> SELECT HEX(c), c = 'a', c = 'a\0\0' from t; +--------+---------+-------------+ | HEX(c) | c = '

T-SQL函数及用法--转

转自http://www.cnblogs.com/qixuejia/archive/2010/07/14/1777105.html 1. 聚合函数 (1) AVG 函数功能返回组中值的平均值.空值将被忽略 语法AVG ( [ ALL | DISTINCT ] expression ) (2) MAX 函数功能返回表达式的最大值 语法MAX ( [ ALL | DISTINCT ] expression ) (3) MIN 函数功能返回表达式的最小值 语法MIN ( [ ALL | DISTINC

【转】mysql 拖库写库用法

mysqldump常用于MySQL数据库逻辑备份. 1.各种用法说明 A. 最简单的用法: mysqldump -uroot -pPassword [database name] > [dump file] 上述命令将指定数据库备份到某dump文件(转储文件)中,比如: mysqldump -uroot -p123 test > test.dump 生成的test.dump文件中包含建表语句(生成数据库结构哦)和插入数据的insert语句. B. --opt 如果加上--opt参数则生成的du

转:sql cast和convert用法详解

原文:http://www.2cto.com/database/201310/250880.html sql cast和convert用法详解 总结: 以下这条仅仅适用于mysql SELECT {fn CONCAT(CONVERT(user_id,CHAR),USER_NAME)} AS str FROM t_sys_user 以下这条仅仅适用于sqlserver2008 SELECT {fn CONCAT(CONVERT(CHAR,user_id),USER_NAME)} AS str FR

mysqldump 的用法

--add-drop--database 在每个CREATE DATABASE语句前添加DROP DATABASE语句. --add-drop-tables 在每个CREATE TABLE语句前添加DROP TABLE语句. --add-locking 用LOCK TABLES和UNLOCK TABLES语句引用每个表转储.重载转储文件时插入得更快. --all--database,-A 转储所有数据库中的所有表.与使用---database选项相同,在命令行中命名所有数据库. --allow-

Sql 中常用日期转换Convert(Datetime)

CONVERT(data_type,expression[,style]) convert(varchar(10),字段名,转换格式) 说明:此样式一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarchar,char,varchar)相互转换的时候才用到. 语句 结果SELECT CONVERT(varchar(100), GETDATE(), 0) 07 15 2009 4:06PMSELECT CONVERT(varchar(100), GETD