5.1.5 二进制类型
MySQL支持两类字符型数据:文本字符串和二进制字符串,前面讲解了存储文本的的字符串类型,这一节将讲解MySQL中存储二进制数据的数据类型,MySQL中的二进制数据类型有:BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,本节将讲解各类二进制类型的特点和使用方法。
表5.8 MySQL中的二进制数据类型
类型名称 |
说明 |
存储需求 |
BIT(M) |
位字段类型 |
大约(M+7)/8个字节 |
BINARY(M) |
固定长度二进制字符串 |
M个字节 |
VARBINARY(M) |
可变长度二进制字符串 |
M+1个字节 |
TINYBLOB(M) |
非常小的BLOB |
L+1 字节, 在此L<2^8<> |
BLOB(M) |
小BLOB |
L+2 字节, 在此L<2^16<> |
MEDIUMBLOB(M) |
中等大小的BLOB |
L+3 字节, 在此L<2^24<> |
LONGBLOB(M) |
非常大的BLOB |
L+4 字节, 在此L<2^32<> |
1.BIT类型
位字段类型。M表示每个值的位数,范围为从1到64。如果M被省略,默认为1。如果为BIT(M)列分配的值的长度小于M位,在值的左边用0填充。例如,为BIT(6)列分配一个值b'101',其效果与分配b'000101'相同。BIT数据类型用来保存位字段值,例如:以二进制的形式保存数据13,13的二进制形式为1101,在这里需要位数至少为4位的BIT类型,即可以定义列类型为BIT(4)。大于二进制的1111数据时不能插入BIT(4)类型的字段中的。
【例5.24】创建表tmp12,定义BIT(4)类型的字段b,向表中插入数据2、9、15、16。
首先创建表tmp12,SQL语句如下:
CREATE TABLE tmp12( b BIT(4) );
插入数据:
mysql> INSERT INTOtmp12 VALUES(2), (9), (15),(16);
Query OK, 4 rows affected (0.02 sec)
Records: 4 Duplicates: 0 Warnings:1
查询插入结果:
mysql> SELECT BIN(b+0) FROM tmp12;
+------------+
| BIN(b+0) |
+------------+
| 10 |
| 1001 |
| 1111 |
| 1111 |
+------------+
4 rows in set (0.00 sec)
b+0表示将二进制的结果转换为对应的数字的值,BIN()函数将数字转换为二进制。从结果中可以看到,成功的将四个数插入到表中。
注意:插入值16的二进制值为10000,在插入之后MySQL将值裁剪到指定范围的相应端点,在这里,指定BIT为4位,因此相应的端点值为1111,并且MySQL保存裁减好的值。
2.BINARY和VARBINARY类型
BINARY和VARBINARY类型类似于CHAR和VARCHAR,不同的是它们包含二进制字节字符串。其使用的语法格式如下:
列名称 BINARY(M)或者VARBINARY(M)
BINARY类型的长度是固定的,指定长度之后,不足最大长度的,将在它们右边填充‘’补齐以达到指定长度。例如:指定列数据类型为BINARY(3),当插入‘a’时,存储的内容实际为“a”,当插入“ab”时,实际存储的内容为“ab”,不管存储的内容是否达到指定的长度,其存储空间均为指定的值M。
VARBINARY类型的长度是可变的,指定好长度之后,其长度可以在0到最大值之间。例如:指定列数据类型为VARBINARY(20),如果插入的值的长度只有10,则实际存储空间为10加1。即其实际占用的空间为字符串的实际长度加1。
【例5.25】创建表tmp13,定义BINARY(3)类型的字段b和VARBINARY(3)类型的字段vb,并向插入数据‘5’,比较两个字段的存储空间。
首先创建表tmp13,输入SQL语句如下:
CREATE TABLE tmp13(
b binary(3), vb varbinary(30)
);
插入数据:
INSERT INTOtmp13 VALUES(5,5);
查看两个字段存储数据的长度:
mysql> SELECT length(b), length(vb) FROM tmp13;
+-----------+--------------+
| length(b) | length(vb) |
+-----------+---------------+
| 3 | 1 |
+-----------+---------------+
1 row in set (0.00 sec)
可以看到,b字段的值数据长度为3,而vb字段的数据长度仅为插入的一个字符的长度1。
如果想要进一步确认‘5’在两个字段中不同的存储方式,输入如下语句:
mysql> SELECT b,vb,b = '5', b='5',vb='5',vb = '5' FROM tmp13;
+------+------+---------+-----------+--------+--------------+
| b | vb | b = '5' | b='5' | vb='5' | vb = '5' |
+------+------+---------+-----------+--------+--------------+
| 5 | 5 | 0 | 1 | 1 | 0 |
+------+------+---------+-----------+--------+--------------+
1 row in set (0.00 sec)
由执行结果可以看出,b字段和vb字段的长度是截然不同的,因为b字段不足的空间填充了‘’,而vb字段则没有填充。
3. BLOB类型
BLOB是一个二进制大对象,用来存储可变数量的数据。BLOB类型分为4种:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,它们可容纳值的最大长度不同,如【表5.9】所示:
表5.9 BLOB类型的存储范围