MySQL学习-数据类型-ENUM,SET以及二进制类型

360 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

前言

上篇我们学习了MySQL中的数据类型中的文本字符串类型。有兴趣的小伙伴可以阅读(# MySQL学习-数据类型-文本字符串类型)。
下面学习MySQL中的数据类型中的ENUM,SET以及二进制类型。

ENUM类型

ENUM类型也叫作枚举类型,ENUM类型的取值范围需要在定义字段时进行指定。设置字段值时,只允许从成员中选取单个值,不能一次选取多个值。其所需要的存储空间由定义ENUM类型时指定的成员个数决定。

类型长度长度范围占用的存储空间
ENUML1<=L<=655351或2个字节
  • 当ENUM类型包含1~255个成员时,需要1个字节的存储空间。
  • 当ENUM类型包含256~65536个成员时,需要2个字节的存储空间。
  • ENUM类型的成员个数上限为65535个。

示例一

创建一个表,包含ENUM类型。

CREATE TABLE test_enum(
season ENUM('春', '夏', '秋', '冬', 'unknow')
);

插入数据。

INSERT INTO test_enum
VALUES('春');

运行是可以正确插入数据的。

示例二

INSERT INTO test_enum
VALUES('UNKNOW');

运行发现,也可以插入数据。这里是忽略大小写的。

示例三

INSERT INTO test_enum
VALUES(1), ('3');

运行发现这样也可以插入数据,并且1对应的是'春','3'对应的是'秋'。即也可以使用索引进行枚举元素的调用。

示例四

INSERT INTO test_enum
VALUES(NULL);

运行发现可以插入NULL数据,是因为我们创建表的时候没有进行非空的限制,所以这里可以添加NULL值。

示例五

INSERT INTO test_enum
VALUES('季节');

运行发现报错,这里不能插入枚举以外的值。

SET类型

SET表示一个字符串对象,可以包含0个或多个成员,但成员个数的上限为64。设置字段值时,可以取取值范围内的0个或多个值。当SET类型包含的成员个数不同时,其所占用的存储空间也是不同的。

成员个数范围占用的存储空间
1<=L<=81个字节
9<=L<=162个字节
17<=L<=243个字节
25<=L<=324个字节
33<=L<=648个字节

SET类型在存储数据时成员个数越多,其占用的存储空间越大。注意:SET类型在选取成员时,可以一次选择多个成员,这一点与ENUM类型不同。

示例六

创建表,包含SET类型。

CREATE TABLE test_set(
s SET('A', 'B', 'C')
);

插入数据。

INSERT INTO test_set
VALUES('A'), ('A,B')

运行发现,SET类可以插入多个数据。

示例七

INSERT INTO test_set
VALUES('A,B,C,A')

运行没有报错,这里插入重复的SET类型成员时,MySQL会自动删除重复的成员。

示例八

INSERT INTO test_set
VALUES('A,B,C,D')

这里运行报错,插入SET成员中不存在的值时,MySQL会报错。

二进制字符串类型

MySQL中的二进制字符串类型主要存储一些二进制数据,比如可以存储图片,音频和视频等二进制数据。MySQL中支持的二进制字符串类型主要包括BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB类型。

BINARY、VARBINARY类型

BINARY、VARBINARY类型类似于CHAR、VARCHAR。只是他们存储的是二进制字符串。

BINARY(M)为固定长度的二进制字符串,M表示最多能存储的字节数,取值范围为0~255个字符。如果字段不足(M)个字节,将在右边填充'\0'以补齐指定长度。

VARBINARY(M)为可变长度的二进制字符串,M表示最多能存储的字节数,总字节数不能超过行的字节长度限制65535,另外还要考虑额外字节开销,VARBINARY类型的数据除了存储数据本身外,还需要1或2个字节来存储数据的字节数。VARBINARY类型必须指定M,否则报错。

类型特点值的长度占用空间
BINARY(M)固定长度M(0<=M<=255)M个字节
VARBINARY(M)可变长度M(0<=M<=65535)M+1个字节

BLOB类型

BLOB是一个二进制的大对象,可以容纳可变数量的数据。

BLOB类型可以存储一个二进制的大对象,比如图片、音频和视频等。但在实际工作中,往往不会再MySQL中使用BLOB类型存储大对象数据,通常会将图片、音频和视频文件存储到服务器的磁盘上,并将图片、音频和视频的访问路径存储到MySQL中。

类型值的长度长度范围占用空间
TINYBLOBL0<=L<=255L+1个字节
BLOBL0<=L<=65535(相当于64kb)L+2个字节
MEDIUMBLOBL0<=L<=16777215(相当于16MB)L+3个字节
LONGBLOBL0<=L<=4294967295(相当于4GB)L+4个字节

今天先学习到这里,明天继续。