0

MySQL数据类型—二进制类型(二十六)

5.1.5  二进制类型

MySQL支持两类字符型数据:文本字符串和二进制字符串,前面讲解了存储文本的的字符串类型,这一节将讲解MySQL中存储二进制数据的数据类型,MySQL中的二进制数据类型有:BITBINARYVARBINARYTINYBLOBBLOBMEDIUMBLOBLONGBLOB,本节将讲解各类二进制类型的特点和使用方法。

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表示每个值的位数,范围为从164。如果M被省略,默认为1。如果为BIT(M)列分配的值的长度小于M位,在值的左边用0填充。例如,为BIT(6)列分配一个值b'101',其效果与分配b'000101'相同。BIT数据类型用来保存位字段值,例如:以二进制的形式保存数据1313的二进制形式为1101,在这里需要位数至少为4位的BIT类型,即可以定义列类型为BIT(4)。大于二进制的1111数据时不能插入BIT(4)类型的字段中的。

【例5.24】创建表tmp12,定义BIT(4)类型的字段b,向表中插入数据291516

首先创建表tmp12SQL语句如下:

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将值裁剪到指定范围的相应端点,在这里,指定BIT4位,因此相应的端点值为1111,并且MySQL保存裁减好的值。

 

2.BINARYVARBINARY类型

BINARYVARBINARY类型类似于CHARVARCHAR,不同的是它们包含二进制字节字符串。其使用的语法格式如下:

列名称 BINARY(M)或者VARBINARY(M)

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

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

【例5.25】创建表tmp13,定义BINARY(3)类型的字段bVARBINARY(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种:TINYBLOBBLOBMEDIUMBLOBLONGBLOB,它们可容纳值的最大长度不同,如【表5.9】所示:

5.9 BLOB类型的存储范围

数据类型

存储范围

TINYBLOB

最大长度为255(28–1)字节

BLOB

最大长度为65,535(216–1)字节

MEDIUMBLOB

最大长度为16,777,215(224–1)字节

LONGBLOB

最大长度为4,294,967,2954GB(232–1)字节

BLOBTEXT的区别:BLOB列存储的是二进制字符串(字节字符串)TEXT列存储的是非二进制字符串(字符字符串)BLOB列没有字符集,并且排序和比较基于列值字节的数值。TEXT列有一个字符集,并且根据字符集对值进行排序和比较。