MySQL数据类型

目录

一、数据类型初识

二、数值类型

2.1 tinyint类型

2.2 bit类型

2.3 float类型

2.4 decimal类型

三、文本、二进制类型

3.1 char类型

3.2 varchar类型

3.3 char与varchar的区别

四、时间日期类型

五、String类型


一、数据类型初识

  • 决定了存储数据时应该开辟的空间大小
  • 决定了如何识别一个特定的二进制序列
  • 决定了数据的取值范围

注意:MySQL本身是不支持bool类型的,当把一个数据设置成bool类型时,数据库会自动将其转换成tinyint(1)的数据类型,其实这个就是变相的bool类型,因为tinyint(1)只有1和0两种取值,可以分别对应bool类型的true和false

二、数值类型

2.1 tinyint类型

有符号tinyint范围测试

创建一个表,表当中包含一个tinyint类型的列,默认其为有符号类型

由于tinyint类型占用1字节,因此有符号tinyint的取值范围为-128~127,插入该范围内的数据时都能成功插入

MySQL数据类型_第1张图片

若插入的数据不在-128~127范围内,那么就会发生报错

MySQL数据类型_第2张图片

无符号tinyint范围测试

创建一个表,表当中包含一个tinyint类型的列,并指定其为无符号类型

MySQL数据类型_第3张图片

由于tinyint类型占用1字节,因此无符号tinyint的取值范围为0~255,插入该范围的数据时都能成功插入

MySQL数据类型_第4张图片

若插入的数据不在0~255范围内,那么就会发生报错

MySQL数据类型_第5张图片

除非场景要求数值类型必须是无符号,否则尽量不要使用无符号,因为有符号的数值类型存不下的数据,其对应的无符号类型同样可能存不下,这时应直接将数值类型提升

2.2 bit类型

bit类型的显示方式

创建一个表,表中包含一个int类型的id列和一个8位bit类型的data列

MySQL数据类型_第6张图片

表中插入一条记录,记录中指定id和data的值均为10,插入记录后查看表会发现data的值显示的并不是10

MySQL数据类型_第7张图片

根本原因是因为bit类型在显示时,是按照ASCII码对应的值进行显示的,而在ASCII码表中10对应的是控制字符LF,表示换行的意思。若向表中插入记录时指定id和data的值均为65,由于ASCII码表中65对应的是字符A,因此插入记录后查看表就会发现data的值显示的是A

MySQL数据类型_第8张图片

bit类型的范围测试

创建一个表,表中包含用户名name和用户性别gender,其中gender的类型可以指定为1位bit类型,因为性别只有男和女两种取值,使用1个bit位来表示用户性别可以节省空间

MySQL数据类型_第9张图片

若规定gender列插入0表示男,插入1表示女,那么在插入用户信息时就可通过插入0和1来指定用户的性别

MySQL数据类型_第10张图片

若插入gender列的数据不是0或1,那么插入数据时就会发生报错

MySQL数据类型_第11张图片

  • 虽然MySQL提供了位类型bit,但不建议将数据类型设置成位类型,除非将来这个数据本身就只给程序看,并且数据本身非常占用资源
  • 因为查询位类型数据时,默认会按照ASCII码对应的值进行显示,这对于数据库管理员维护数据库或程序员调试程序都不太方便

2.3 float类型

有符号float范围测试

创建一个表,表中包含一个float(4,2)类型的列,默认其为有符号类型

MySQL数据类型_第12张图片

由于float(4,2)的取值范围为-99.99~99.99,因此插入该范围内的数据都能成功插入

MySQL数据类型_第13张图片

由于MySQL在保存值时会进行四舍五入,因此实际可插入float(4,2)的范围为-99.994~99.994,若插入的数据不在该范围内,那么插入数据时就会报错

MySQL数据类型_第14张图片

无符号float范围测试

创建一个表,表中包含一个float(4,2)类型的列,并指定其为无符号类型

MySQL数据类型_第15张图片

无符号float类型的取值范围,实际就是把对应有符号float类型中的负数部分拿走了,因此float(4,2)的取值范围为0~99.99,实际可插入的范围是0~99.994

MySQL数据类型_第16张图片

2.4 decimal类型

decimal的精度更高

decimal和float类型的使用方式相同,但decimal的精度比float更高。创建一个表,表中分别包含一个float(10,8)的列和一个decimal(10,8)的列

MySQL数据类型_第17张图片

向表中插入一条记录,指定float和decimal的值均为23.12345612,但最终查表时会发现decimal保持了数据的原貌,而float则会存在一定的精度损失

MySQL数据类型_第18张图片

三、文本、二进制类型

3.1 char类型

创建一个表,表中包含一个char(10)的content列

MySQL数据类型_第19张图片

由于char(10)中最多可存储6个字符,因此只要插入的字符个数不超过6个都是能成功插入的。若插入的字符个数超过10个,那么就会报错

MySQL数据类型_第20张图片

在不同编码中,一个字符所占的字节个数是不同的,如utf8中一个字符占3个字节,而gbk中一个字符占2个字节。MySQL限定字符的概念不是限制字节的,用户不用关心复杂的编码细节

3.2 varchar类型

varchar类型测试

创建一个表,表中包含一个varchar(10)的content列

MySQL数据类型_第21张图片

由于varchar(10)中最多可存储10个字符,因此只要插入的字符个数不超过6都是能够成功插入的。若插入的字符个数超过6个,那么就会报错

MySQL数据类型_第22张图片

varchar类型可指定的字符个数上限

varchar类型最多占用65535字节,其中有1~2字节用来表示实际数据长度,还有1字节来存储其他控制信息,因此varchar类型的有效字节数最多是65532字节

而varchar类型可指定的字符个数上限,与表的编码格式有关:

对于utf8编码来说,一个字符占用三个字节,因此varchar(L)中的L最大可指定为 65532 ÷ 3 = 21844
对于gbk编码来说,一个字符占用两个字节,因此varchar(L)中的L最大可指定为 65532 ÷ 2 = 32766

在定义编码格式为utf8的表时,varchar(L)中的L若超过了21844,则会产生报错

在定义编码格式为gbk的表时,varchar(L)中的L若超过了32766,则会产生报错

3.3 char与varchar的区别

char和varchar比较

char类型可存储字符上限为255,varchar类型可存储字符上限则与表的编码格式有关
char(L)定义后,无论存储的字符串长度是否到达L,都会开辟用于存储L个字符的定长空间,若存储的字符串长度超过L则会报错
varchar(L)定义后,会根据存储字符串的长度按需开辟空间,并且需要使用1-3字节的空间用于表示存储字符串的长度以及其他控制信息,若存储的字符串长度超过L则会报错

如何选取char和varchar类型?

char类型的数据是定长的,因此磁盘空间比较浪费,但是效率高(直接访问定长的空间)
varchar类型的数据是变长的,因此磁盘空间比较节省,但是效率低(需要先读取存储字符串的长度,再访问指定长度的空间)
若要存储的数据是定长的,则使用char类型进行存储,如身份证号码、手机号、md5等。若要存储的数据是变长的,则使用varchar类型进行存储,如名字、地址等

四、时间日期类型

三种时间日期类型

  • date:日期格式为YYYY-MM-DD,占用三字节
  • datetime:时间日期格式为YYYY-MM-DD HH:MM:SS,占用八字节
  • timestamp:时间戳,格式为YYYY-MM-DD HH:MM:SS,占用四字节

创建一个表,表中包含date、datetime和timestamp三种时间日期类型的列

MySQL数据类型_第23张图片

通过表结构可以看出,timestamp类型的t3列不允许为空,其默认值为CURRENT_TIMESTAMP

MySQL数据类型_第24张图片

若插入数据时不插入t3列,则会自动插入当前时间戳

MySQL数据类型_第25张图片

timestamp类型使用案例

创建一个评论表,表中包含评论人的昵称、评论的内容和评论的发布时间

MySQL数据类型_第26张图片

向评论表中插入记录时,只需指明评论人的昵称和评论的内容,评论的发布时间默认会设置成该记录的插入时间

MySQL数据类型_第27张图片

若评论人修改了评论内容,就需对评论表更新,更新表的同时,评论的发布时间也会更新为修改表的时间

MySQL数据类型_第28张图片

五、String类型

enum和set类型的区别如下:

  • 在定义enum字段时需提供若干个选项的值,设置enum字段值时只允许选取其中的一个值
  • 在定义set字段时需提供若干个选项的值,设置set字段值时可选取其中的一个或多个值

如人的性别只能从男和女中进行二选一,因此可以定义成enum类型,而人的爱好在提供的选项中可能存在多个,因此可以定义成set类型

调查表案例

创建一个调查表,表中包含被调查人的姓名、性别和爱好

MySQL数据类型_第29张图片

向表中插入记录时,被调查人的性别能从男和女中进行二选一,被调查人的爱好可从提供的若干个选项中进行选择一项或多项,多个爱好之间需通过英文逗号隔开

MySQL数据类型_第30张图片

通过数字设置enum

在插入记录时,除了通过指明男女来设置性别,还可以通过插入数字1和2来设置性别

MySQL数据类型_第31张图片

MySQL出于效率考虑,在存储enum值时实际存储的都是数字,enum中提供的选项值依次对应数字1、2、3、…,最多65535个,因此在设置enum值时可以通过数字的方式进行设置

通过数字设置set

在插入记录时,除了通过指明多个选项来设置爱好,还可通过数字的方式来设置

MySQL数据类型_第32张图片

MySQL存储set值时实际存储的也是数字,set中提供的选项值依次对应数字1、2、4、8、…,最多64个,因此在设置set值时可以通过数字的方式进行设置。MySQL通过二进制理解数字设置,将数字11转换为二进制1011,即分别选择了第一个、第二个、第四个选项,即敲代码、游泳、乒乓球

注意:虽然enum和set可通过数字的方式进行设置,但不推荐,因为可读性太差,导致后期维护成本变高

enum和set查找

若想筛选出调查表中所有女同志的信息,那么直接在筛选时指明 gender='女' 即可,因为enum类型的值只能多选一

MySQL数据类型_第33张图片

但若要筛选出调查表中爱好包含敲代码的人的信息就较为麻烦,若继续使用上述方式,那么最终筛选出来的是爱好仅为敲代码的人的信息

MySQL数据类型_第34张图片

这时需借助find_in_set(str,strlist)函数,该函数的作用是查询strlist中是否包含str,若包含则返回str在strlist中的位置(从1开始),否则返回0

通过select可以对find_in_set函数进行验证,依次查找集合a,b,c中是否包含字符a、b、d,这时在查找字符a、b和c时就会得到其在集合中的下标,而在查找字符d时就会得到0值

MySQL数据类型_第35张图片

可以通过select搭配find_in_set函数,来筛选出爱好包含敲代码的人的信息了

MySQL数据类型_第36张图片

还可以继续添加筛选条件,如筛选出爱好中包含敲代码,但爱好又不只是敲代码的人的信息

MySQL数据类型_第37张图片

 

 

你可能感兴趣的:(MySQL,mysql,数据库)