文章目录
MySQL数据类型
数据类型的作用:
- 决定了存储数据时应该开辟的空间大小。
- 决定了如何识别一个特定的二进制序列。
- 决定了数据的取值范围。
数值类型
tinyint类型
有符号tinyint范围测试
创建一个表,表当中包含一个tinyint类型的列,默认其为有符号类型。如下:
由于tinyint类型占用1字节,因此有符号tinyint的取值范围为-128~127,插入该范围内的数据时都能成功插入。如下:
如果插入的数据不在-128~127范围内,那么插入数据时就会产生报错。如下:
无符号tinyint范围测试
创建一个表,表当中包含一个tinyint类型的列,并指定其为无符号类型。如下:
由于tinyint类型占用1字节,因此无符号tinyint的取值范围为0~255,插入该范围的数据时都能成功插入。如下:
如果插入的数据不在0~255范围内,那么插入数据时就会产生报错。如下:
注意:
除非场景要求数值类型必须是无符号,否则尽量不要使用无符号,因为有符号的数值类型存不下的数据,其对应的无符号类型同样可能存不下,这时应该直接将数值类型进行提升。
bit类型
bit类型的显示方式
创建一个表,表当中包含一个int类型的id列和一个8位bit类型的a列。如下:
向表中插入一条记录,记录中指定id和a的值均为10,插入记录后查看表会发现a的值显示是16进制下的10。如下:
注意:
- 虽然MySQL提供了位类型bit,但一般不建议将数据类型设置成位类型,除非将来这个数据本身就只是给程序看的,并且数据本身非常占用资源。
- 因为查询位类型数据时,默认会按照ASCII码对应的值进行显示,这对于将来数据库管理员维护数据库或程序员调试程序都是不太方便的。
float类型
有符号float范围测试
创建一个表,表当中包含一个float(4,2)类型的列,默认其为有符号类型。如下:
由于float(4,2)的取值范围为-99.99~99.99,因此插入该范围内的数据都能成功插入。如下:
此外,由于MySQL在保存值时会进行四舍五入,因此实际可插入float(4,2)的范围为-99.994~99.994,如果插入的数据不在该范围内,那么插入数据时就会产生报错。如下:
有符号float范围测试
创建一个表,表当中包含一个float(4,2)类型的列,并指定其为无符号类型。如下:
无符号float类型的取值范围,实际就是把对应有符号float类型中的负数部分拿走了,因此float(4,2)的取值范围为099.99,实际可插入的范围是099.994。如下:
如果插入的数据不在0~99.994范围内,那么插入数据时就会产生报错。如下:
decimal类型
decimal的精度更高
decimal和float类型的使用方式一样,但decimal的精度比float更高。
创建一个表,表当中分别包含一个float(10,8)的列和一个decimal(10,8)的列。如下:
向表当中插入一条记录,指定float和decimal的值均为23.12345612,但最终查表时会发现decimal保持了数据的原貌,而float则会存在一定的精度损失。如下:
字符串类型
char类型
char类型测试
创建一个表,表当中包含一个char(6)的content列。如下:
由于char(6)中最多可存储6个字符,因此只要插入的字符个数不超过6个都是能够成功插入的。如下:
如果插入的字符个数超过了6个,那么在插入数据时就会产生报错。如下:
需要注意的是,这里所说的字符并不只是指一个英文字母,一个汉字也是一个字符,因此只要插入的汉字个数不超过6个也是可以插入的。如下:
注意:
在不同编码中,一个字符所占的字节个数是不同的,比如utf8中一个字符占3个字节,而gbk中一个字符占2个字节。MySQL限定字符的概念不是字节,这样用户就不用关心复杂的编码细节了。
varchar类型
varchar类型测试
创建一个表,表当中包含一个varchar(6)的content列。如下:
- 由于varchar(6)中最多可存储6个字符,因此只要插入的字符个数不超过6都是能够成功插入的。
- 如果插入的字符个数超过了6个,那么在插入数据时就会产生报错。
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,则会产生报错。如下:
char和varchar比较
char和varchar比较
char和varchar的区别如下:
- char类型可存储字符上限为255,varchar类型可存储字符上限与表的编码格式有关。
- char(L)定义后,无论存储的字符串长度是否到达L,都会开辟用于存储L个字符的定长空间,如果存储的字符串长度超过L则会报错。
- varchar(L)定义后,会根据存储字符串的长度按需开辟空间,并且需要使用1-3字节的空间用于表示存储字符串的长度以及其他控制信息,如果存储的字符串长度超过L则会报错。
char和varchar类型优缺点
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三种时间日期类型的列。如下:
如果插入数据时插入CURRENT_TIMESTAMP 到t3 ,就会插入当前的时间戳。如下:
enum和set类型
enum和set类型
enum和set类型的区别如下:
- 在定义enum字段时需要提供若干个选项的值,在设置enum字段值时只允许选取其中的一个值。
- 在定义set字段时需要提供若干个选项的值,在设置set字段值时可以选取其中的一个或多个值。
比如人的性别只能从男和女中进行二选一,因此可以定义成enum类型,而人的爱好在提供的选项中可能存在多个,因此可以定义成set类型。
调查表案例
创建一个调查表,表当中包含被调查人的姓名、性别和爱好。如下:
向表中插入记录时,被调查人的性别只能从男和女中进行二选一,被调查人的爱好可以从提供的若干个选项中进行多选一或多选多,多个爱好之间需要通过英文逗号隔开。如下:
通过数字设置enum
注意:
MySQL出于效率考虑,在存储enum值时实际存储的都是数字,enum中提供的选项值依次对应数字1、2、3、…,最多65535个,因此在设置enum值时可以通过数字的方式进行设置。
通过数字设置set
因为MySQL存储set值时实际存储的也是数字,set中提供的选项值依次对应数字1、2、4、8、…,最多64个,因此在设置set值时可以通过数字的方式进行设置。
注意 :
虽然enum和set可以通过数字的方式进行设置,但严重不推荐这种做法,因为这样的SQL可读性太差,导致后期维护成本变高。
enum和set查找
如果想要筛选出调查表中所有男同志的信息,那么直接在筛选时指明gender='男’即可,因为enum类型的值只能多选一。如下:
但如果要筛选出调查表中爱好包含打羽毛球的人的信息就比较麻烦了,如果继续使用上述方式,那么最终筛选出来的是爱好仅为打羽毛球的人的信息。如下:
这时就可以通过select搭配find_in_set函数,来筛选出爱好包含打羽毛球的人的信息了。如下:
注意:
后面也可以加继续筛选 例如 :