MySQL数据库(4)—— 数据类型
目录
一,数据类型分类
二,数值类型
2.1 tinyint类型
2.2 bit类型
2.3 float类型
2.4 decimal类型
三,字符串类型
3.1 char类型
3.2 varchar类型
四,时间日期类型
五,enum和set类型
5.1 基本使用
5.2 解释查找
一,数据类型分类
类型分类 | 类型 | 说明 |
---|---|---|
数值类型 | BIT(M) | 位类型:M指定位数,默认值为1,范围为1-64 |
BOOL | 布尔类型,1表示真,0表示假 | |
TINYINT [UNSIGNED] | 占用1字节,默认为有符号 | |
SMALLINT [UNSIGNED] | 占用2字节,默认为有符号 | |
MEDIUMINT [UNSIGNED] | 占用3字节,默认为有符号 | |
INT [UNSIGNED] | 占用4字节,默认为有符号 | |
BIGINT [UNSIGNED] | 占用8字节,默认为有符号 | |
FLOAT[(M,D)] [UNSIGNED] | 占用4字节,M指定显示长度,D指定小数位数 | |
DOUBLE[(M,D)] [UNSIGNED] | 占用8字节,M指定显示长度,D指定小数位数 | |
DECIMAL(M,D) [UNSIGNED] | M指定显示长度,D指定小数位数,每4个字节表示9个数字,小数点占用1字节 | |
字符串类型 | ENUM | 枚举类型:ENUM类型的取值范围需要在定义字段时进行指定,设置字段值时只允许从成员中选取单个值,其所需的存储空间由定义ENUM类型时指定的成员个数决定 |
SET | 集合类型:SET类型的取值范围需要在定义字段时进行指定,设置字段值时可以从成员中选取一个或多个值,其所需的存储空间由定义SET类型时指定的成员个数决定 | |
时间日期类型 | DATE / DATETIME | 日期类型:YYYY-MM-DD格式 / YYYY-MM-DD HH:MM:SS格式 |
TIMESTAMP | 时间戳:以YYYY-MM-DD HH:MM:SS格式进行显示 | |
文本,二进制类型 | CHAR(L) | 固定长度字符串:L指定字符串长度,最大为255 |
VARCHAR(L) | 可变长度字符串:L指定字符串长度上限,最多占用65535字节 | |
BLOB | 用于存储二进制数据 | |
TEXT | 用于存储大文本数据 |
- 注意:MySQL本身是不支持bool类型的,当把一个数据设置成bool类型时,数据库会自动将其转换成tinyint(1)的数据类型,其实这个就是变相的bool类型,因为tinyint(1)代表只有一个二进制位,也就是只有1和0两种取值,可以分别对应bool类型的true和false。 (搞一个bool可能是为了完善理论)
二,数值类型
2.1 tinyint类型
①有符号tinyint
- tinyint占用1字节,是8各比特位,所以能表示的范围是 -128~127
- 如果插入的值超过这个范围就会报错
②无符号tinyint
- 范围是0~255,其余规则和有符号tinyint一样
- 除非场景必须要求要是无符号,否则尽量不要使用无符号,因为有符号的数值类型存不下的数据,其对应的无符号类型可能同样存不下,这时应该将数值类型进行提升
2.2 bit类型
我们先建一个表:
由于我们把bit的位数设置成1,表示只有一个比特位,所以只能插入0或1:
然后就是查询:
上面第一次查询时显示的online不是0或1,因为bit类型在显示时,是按照ASCII码对应的值进行显示的,如果我们插入的是65,那么显示的就是A ,如下:
2.3 float类型
①有符号float
float[(m,d)] [unsigned]; m表示指定长度,d表示小数位数,
- 比如我们定义float(4,2),那么就是代表4位数,范围是-99.99 ~ 99.99
- 并且float还有四舍五入机制,比如我们插入23.456,那么最后存的就是23.46
②无符号float
- 无符号就是去掉了负数,比如还是float(4,2) ,但是表示的范围只有0 ~ 99.99 了
2.4 decimal类型
- decimal类型的使用方式和float是一样的,但是decimal的精度更高
三,字符串类型
3.1 char类型
char(L) L最大为255
- 假设是char(6),那么只要插入的字符个数不超过6个都能成功插入,如果超过6个就会报错
- 这里说的字符不是单指一个字母,一个汉字也是一个祝福,所以也可以插入6个汉字
- 在不同编码中,一个字符所占字节个数是不同的,比如utf8中一个字符占3字节,gbk占2字节
- 这样MySQL中字符就不用字节来描述了,这样用户就不用关心复杂的编码细节了,能让用户使用更便捷
3.2 varchar类型
varchar类型的使用和char是一样的,但是二者有一些区别:
- char类型可存储的字符上限位255,varchar类型可存储的字符上限与表的编码格式有关
- char(L)定义后,不论字符串的长度是否达到L,都会开辟用于存储L个字符长度的定长空间,所以称为定长字符串类型
- 而varchar类型会根据字符串长度按需开辟空间,比如varchar(6)定义后,假设只存了两个字符,那么就只会开辟两个字符的空间,另外开辟1-3字节的空间用于表示存储字符串长度以及其它控制信息
varchar类型最多占用65535字节,其中1~2字节用来表示实际数据长度,还有1字节用来存储其它控制信息,所以varchar类型的有效字节数最多是65532字节
而varchar类型可指定的字符个数上限与表的编码格式有关:
- 对于utf8编码来说:一个字符占用三个字节,因此varchar(L)中的L最大可指定为 65532 ÷ 3 = 21844
- 对于gbk编码来说:一个字符占两个字节,因此varchar(L)中的L最大可指定为 65532 ÷ 2 = 32766
char和varchar的优缺点:
- char类型的数据是定长的,因此有一定的空间浪费,但是因为是定长的,所以访问效率较高
- varchar类型可以节省空间,但是由于要先读取部分信息然后再去读取数据,所以效率较低
如果数据是定长的比如手机号码、身份证号等定长数据就可以用char存;如果数据是变长的比如名字、 居住地址等就可以用varchar
四,时间日期类型
常用的三种时间日期类型如下:
- date:日期格式为YYYY-MM-DD,占三字节,允许为空
- datetime:时间日期格式为YYYY-MM-DD HH:MM:SS,占八字节,允许为空
- timestamp:为时间戳,格式为YYYY-MM-DD HH:MM:SS,占四字节;不允许为空,如果我们不插入该列数据,那么会自动填充当前的时间戳
使用timestamp创建评论表:
在插入评论人的昵称和评论的内容时,发布时间会默认设置成插入时间;并且如果修改了评论内容,对应的发布时间也会更新:
五,enum和set类型
5.1 基本使用
这两个类型的区别:
- 在定义enum字段时需要提供若干个选项,在正式设置enum字段时只能选取其中的一个值。
- 在定义set字段时需要提供若干个选项的值,在设置set字段值时可以选取其中的一个或多个值。
比如人的性别只有两个,因此可以定义成enum类型;而人的身份可以有多个,所以可以定义成set类型
创建一个表,包含姓名,性别,身份,如下:
在插入数据时,性别就只能二选一,身份就可以多选,身份通过逗号隔开:
MySQL出于效率考虑,在存储enum和set的值时实际存储的是数字,规则如下:
enum数字规则:
- enum中提供的选项值是持续递增的1、2、3、4持续递增,最多65535个
- 所以可以在设置enum时可以通过数字进行设置
set数字规则:
- set提供的选项值是1、2、4、8这样两倍递增的数字,最多64个
- 上面我们输入的是4,所以直接找到了第三个位置的值也就是“ 团员 ”
- 如果我们输入的是11,由于8的两倍是16,所以先找到8也就是第四个位置,然后用11减去8得到3,由于3比4小所以再次找到2,也就是第二个位置;最后3减去2剩下1,于是最后找到第一个位置,如下:
5.2 解释查找
先再插入一条信息方便演示:
insert into t10 values('赵六','男','实习生');
如果要筛选出表中所有男同志的信息,只要在搜索时指明“ gender='男' ”即可,但是如果要搜索到身份是实习生的人的信息就不好搞了,如下:
可以看到它是非常死板的单一匹配,不具备模糊匹配的功能,所以我们需要借助一个函数
find_in_set(str, strlist)函数介绍:
该函数作用是查询strlist中是否包含str,如果包含则返回str在strlist中的位置,从1开始,否则返回0下面是对该函数的演示:
所以我们通过select搭配find_in_set函数就可以实现模糊筛选了: