当前位置:嗨网首页>书籍在线阅读

07-二进制类型

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

6.1.5 二进制类型

MySQL支持两种字符型数据:文本字符串和二进制字符串。前面讲了文本字符串类型,本小节讲解MySQL中用来存储二进制数据的数据类型。MySQL中的二进制数据类型有:BIT、BINARY、VARBINARY,TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。下表列出了MySQL中的二进制数据类型。

Figure-0155-151.jpg 1.BIT类型

上表中,BIT(M)为位字段类型,M表示每个值的位数,取值范围为1~64。如果M被省略,默认为1。如果为BIT(M)字段分配的值的长度小于M位,在值的左边用0填充。例如,为BIT(6)字段分配一个值b‘101’,其效果与分配b‘000101’相同。BIT数据类型用来保存位字段值,例如,以二进制的形式保存十进制数据12,12的二进制形式为1100,在这里需要位数至少为4位的BIT类型,即可以定义字段类型BIT(4)。大于二进制1111的数据不能插入BIT(4)类型的字段中。

【范例6-24】

创建表ex12,定义字段a为BIT(4)类型,向表中插入数值3,7,15,16。

首先创建表ex12,SQL语句如下。

create table ex12 (a BIT(4));

向表中插入数据并查看插入结果,SQL语句如下。

insert into ex12 values (3),(7),(15);

查看执行结果如下。

mysql> create table ex12 (a BIT(4)); Query OK, 0 rows affected (0.28 sec) mysql> insert into ex12 values (3),(7),(15); Query OK, 3 rows affected (0.05 sec) Records:3 Duplicates:0 Warnings:0

继续向表中插入测试数据,SQL语句如下。

insert into ex12 values (16);

执行结果如下。

mysql> insert into ex12 values (16); ERROR 1406 (22001): Data too long for column 'a' at row 1

结果显示,十进制数16已超出了BIT(4)的取值范围。

最后,要使用BIN()函数将数值转换为二进制,a+0表示将二进制的结果转换为对应的数值,并select查询结果,SQL语句如下。

select BIN(a+0) from ex12;

执行结果如下。

mysql> select BIN(a+0) from ex12; +----------+ | BIN(a+0) | +----------+ |11 | |111 | |1111 | +----------+

提示 默认情况下,MySQL不可以插入超出该字段类型允许范围的值,如十进制数16,超出了BIT(4)的取值范围,系统报错。

2.BINARY和VARBINARY类型

BINARY和VARBINARY类型类似于CHAR和VARCHAR,不同的是它们包含二进制字符串。其语法格式如下。

字段名称 BINARY(M)或VARBINARY(M)

其中,BINARY类型的长度是固定的,指定长度后,不足最大长度的,将在右边填充‘\0’补齐以达到指定长度。例如:指定字段数据类型为BINARY(4),当插入‘a’时,存储的内容实际为‘a\0\0\0’,当插入‘ab’时,实际存储的内容为‘ab\0\0’,不管存储的内容是否达到指定的长度,其存储空间均为指定的值M。

VARBINARY类型的长度是可变的,指定好长度后,其长度可以在0到最大值之间。例如,指定字段数据类型为VARBINARY(30),如果插入的值的长度只有20,则实际存储空间为20+1,即其实际占用的空间为字符串的实际长度加1。

【范例6-25】

创建表ex13,定义字段a为BINARY(3)类型,字段b为VARBINARY(3),向表中插入测试数值5,比较字段a和b的存储空间。

首先创建表ex13,SQL语句如下。

create table ex13 (a BINA RY(3), b VARBINARY(3));

向表中插入数据并查看插入结果,SQL语句如下。

insert into ex13 values (5,5);

查看执行结果如下。

mysql> create table ex13 (a BINARY(3), b VARBINARY(3)); Query OK, 0 rows affected (0.56 sec) mysql> insert into ex13 values (5,5); Query OK, 1 row affected (0.04 sec)

使用length()函数查看字段a和字段b中存储数据的长度,SQL语句如下。

select length(a),length(b) from ex13;

执行结果如下。

mysql> select length(a),length(b) from ex13; +-----------+-----------+ | length(a) | length(b) | +-----------+-----------+ | 3| 1| +-----------+-----------+

结果显示,字段a的值的存储长度是3,而字段b的数据长度是1。

为了进一步确认数值5在字段a和b中不同的存储方式,使用以下SQL查询。

select a,b,a='5',a='5\0\0',b='5',b='5\0\0' from ex13;

执行结果如下。

mysql> select a,b,a='5',a='5\0\0',b='5',b='5\0\0' from ex13; +------+------+-------+-----------+-------+-----------+ |a |b |a='5'|a='5\0\0'|b='5'|b='5\0\0'| +------+------+-------+-----------+-------+-----------+ |5 |5 | 0| 1| 1| 0| +------+------+-------+-----------+-------+-----------+

由执行结果可以看出,字段a和b长度不同,因为字段a是BINARY类型,不足的空间用‘\0’补满,而字段b是VARBINARY类型,是可变的长度,不需要填充。

3.BLOB类型

BLOB类型是一个二进制大对象,用来存储可变数量的数据。BLOB类型分为4种:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,它们的存储范围见下表。

Figure-0158-152.jpg BLOB字段存储的是二进制字符串(字节字符串),TEXT存储的是非二进制字符串(字符字符串)。BLOB字段没有字符集,且排列和比较基于字段值字节的数值,TEXT字段有一个字符集,并根据字符集对值进行排序和比较。