MySQL数据类型

目录

数据类型分类

 tinyint类型

bit类型

小数类型 

float类型

decimal类型 

字符串类型 

char类型

varchar类型 

char(size)和varchar(size)类型比较

时间类型

string类型

enum枚举类型

set集合类型 

find_in_set函数


       在C语言和C++中,我们学习了多种数据类型,MySQL数据库主要是用于数据的存储和查询,所以对于数据的类型只会更加重视,基于此,本期我们将展开学习MySQL数据库的数据类型。

数据类型分类

        类型分类表如下。

               分类                           数据类型                      描述
数值类型                    bit(m)类型。m表示位数,默认值为1,范围为1~64
                     bool使用0和1表示假和真
            tinyint [unsigned]1字节,带符号是-128~127,无符号范围0~255.默认有符号
          smallint [unsigned]2字节,带符号是-2^15~2^15-1,无符号是2^16-1   
                mediumint3字节,带符号是-2^23~2^23-1,无符号是2^24-1
               int [unsigned]4字节,带符号是-2^31~ 2^31-1,无符号是2^32-1
          bigint [unsigned]8字节,带符号是-2^63~2^63-1,无符号是2^64-1
      float [(m,d)] [unsigned]4字节,m指定显示的十进制数字总长度,d表示小数位数
    double [(m,d)] [unsigned]8字节,m指定显示的十进制数字总长度,d表示小数位数,精度比float大
     decimal(m,d) [unsigned]与float类似,但是其精度比float更精确
    字符串类型/其它类型                        char(size)固定长度的字符串,size表示字符串中字符的个数,size最大为255
               varchar(size)可变长度字符串,size表示字符串中字符的个数,varchar(size)可以表示的最大的字符串的大小为65532字节
                    blob二进制数据类型,如音频
                    text文本类型
        时间类型     date/datetime/timestamp日期类型(年-月-日),时间类型(年-月-日 时:分:秒),timestamp为时间戳类型,表示当前实时时间
       特殊字符串类型                 enum类型enum的每个选项是一个字符串,其值来自表创建时,为特定字段设置的枚举值。
                   set类型set的每个选项是一个字符串,其值来自表创建时规定的允许的一列值。

 tinyint类型

            tinyint [unsigned]1字节,带符号是-128~127,无符号范围0~255,默认有符号

         我们创建了一个tint字段,类型为tinyint类型。

        tinyint的取值范围为-128~127。所以当我们插入处于此范围的数据,是可以插入成功的,否则会显示越界错误,插入图示如下。 

        创建表t2,将tint字段的tinyint类型转为tinyint unsigned类型。

        tyint的取值范围为0~255,所以当我们插入处于此范围的数据,是可以插入成功的,否则会显示越界错误,插入图示如下。

bit类型

                    bit(m)类型。m表示位数,默认值为1,范围为1~64

         创建了一个表t3,表中有两个字段,一个为num1类型为int,一个为num2类型为bit(8),8表示有8个bit位。

 我们往表中插入了一条记录,num1和num2的值都设置为了10。

        但是最终我们发现,查询出来的结果之中,num2字段竟然没有任何数据,这是为什么呢?

        这是因为bit类型在数据库中表示的其实就是bit类型所表示的10进制数在ASCII码中对应的字符,而ASCII码表中的字符又分为控制字符和打印字符,打印字符是可以看见的,但是控制字符是看不见的,这就是为什么给bit类型的字段插入10时,我们查询出的结果中什么也看不到。

        如果我们插入33时,33对应的字符是打印字符 !,所以此时我们就可以看见了。图示如下。

小数类型 

float类型

      float [(m,d)] [unsigned]4字节,m指定显示的十进制数字总长度,d表示小数位数

           创建了表t4,3个字段f1,f2,f3。如下图所示。

        依次向t4表中插入如下图所示的合法数据,显示插入成功。

           依次向t4表中插入如下图所示的不合法数据,显示插入越界。

decimal类型 

     decimal(m,d) [unsigned]与float类似,但是其精度比float更精确

          创建了表t5,三个字段分别为,d1,d2,d3。如下图所示。

        我们依次插入与t4表中相同的数据。

        我们发现了,插入了相同的值,插入成功了,且在显示的时候也与t4表中float类型显示的小数格式是一样的,所以float和decimal的区别到底是什么呢?我们不妨给一个更多位的小数。 

        我们给t4表新建一个f4字段,类型位float(10,8),表示是一个10位小数,小数点后有8位。

        同样的给t4表添加一个d5字段,类型为decimal(10,8), 表示是一个10位小数,小数点后有8位。 

       给f4字段和d5字段分别插入数据 12.34567891。 

        不难发现,decimal类型的小数确实是比float类型的小数的精度要高,所以我们一般情况下建议使用decimal类型作为小数的类型。 

字符串类型 

char类型

                 char(size)固定长度的字符串,size表示字符串中字符的个数,size最大为255

         创建了表t6,字段name的类型为char(6),表示为字符串类型,6表示字符串中有6个字符。

        依次插入合法的字符串和非法字符串,图示如下。 

        我们给t6表中新建一个xingming字段,类型为char(256)。

        我们发现这是不能创建的,因为char(size),size的最大值为255,也就意味着字符串中只能存储255个字符。

        同时,我们需要注意的是,一个汉字和一个英文字母都是一个字符,但是它们的每个字符所占用的字节数是不一样的,在utf编码中,一个中文字符是3个字节,一个英文字符是1个字节,在gbk编码下,一个中文字符是2个字节,而一个英文字符是1个字节

varchar类型 

          varchar(size)可变长度字符串,size表示字符串中字符的个数,varchar(size)可以表示的最大的字符串的大小为65532字节。原本varchar(size)可以表示的最大的字符串的字节数为65535个字节,但是要有1~3个字节表示字符串的数据大小,所以才导致了有效字节数是65532字节,这也是为什么表示的最大字符串的大小为65532字节的原因。

          varchar类型和char类型中的size的含义是一样的,但是需要注意的是char中的size最大是255,但是varchar中的size最大的值是要进行计算的,可以根据varchar(size)可以表示的最大字符串的字节数,计算出字符的个数,也就是size的值。在utf8编码中,一个汉字是3个字节,所以在utf8编码中,size的最大值为65532/3=21844,但是在gbk编码中,size的最大值为65532/2=32766。

        varchar类型的使用和char完全一样,所以我们不予以演示,但是我们要检验一下,varchar(size)中的size值在不同的编码规则之下是否是和我们上述计算的值一致。

        创建表t7表的编码格式为gbk格式。      

        如上图所示,当size的大小为32766是是可以的,但是为32767是就已经出现了越界的错误,这符合我们的预期。

        创建表t8,字段name的数据类型为varchar(21844)类型,编码格式为utf8

        将name字段该为xingming,类型改为varchar(21846)。

        我们发现,在utf8编码格式下,varchar(size)中的size的大小确实只能为21844,符合我们的预期。 

char(size)和varchar(size)类型比较

        简单的就可以理解为,char(size)是一个定长字符串, 而varchar(size)是一个变长字符串。

实际存储/utf8编码char(4)占用字节varchar(4)占用字节
ab12字节6字节
abc12字节9字节
abcd12字节12字节

char(size):提前开辟空间,所以会存在空间浪费的情况,但是效率高,一般使用定长数据的类型,如身份证号,学号,电话号,邮政编码。

varchar(size):需要时再开辟空间,空间合理使用,但是效率低,一般使用不定长的类型,姓名,账户名,密码。 

时间类型

     date/datetime/timestamp日期类型(年-月-日),时间类型(年-月-日 时:分:秒),timestamp为时间戳类型,表示当前实时时间

         创建表t9,三个字段为d1,d2,t3,类型分别为date,datetime,timestamp类型。

        依次插入对应类型的数据,需要注意的是,时间戳类型字段,即使我们没有主动插入,也会自动填充计算机当前时间。

        当我们修改任一记录的数据,只要当前记录中的任意一个字段被修改了,那么时间戳类型字段也会发生更改。

        如上图,我们更改了d1的所有记录,所以每个记录的d3字段的时间戳数据都发生了变化。 

string类型

enum枚举类型

                 enum类型enum的每一个选项是一个字符串,其值来自表创建时,为特定字段设置的枚举值。

        enum('选项1','选项2',...)

        创建表t10,字段gender的类型为enum类型。

         在插入记录时,enum字段的数据必须是enum中含有的选项,也可以使用数字代替enum的选项,1代表第一项,2代表第二项。本质就是将选项通过bit位来表示(第一个bit位标识第一个选项,第二个同理),10进制的1代表着第一个bit位为第一个选项,10进制2代表着第二个bit位为第二个选项,如果对应的点bit位为1,代表着这个bit位对应的选项已经被选。

        但是要注意的是,枚举类型一次只能选取枚举中的一个选项,不能多选。

set集合类型 

                   set类型set的每个选项是一个字符串,其值来自表创建时规定的允许的一列值。

        set('选项1','选项2' ,'选项3')类型是支持多选的。       

        在t10表中新增hobby字段,表示爱好,类型为set类型。

        set类型和enum一样,可以在选择时根据bit位为1的原则进行选项的选择,如下图。 

        t10的表中enum字段和set字段分别有2个选项和5个选项,所以就对应了2个bit位和5个bit位,因为enum只能选一个所以2个bit位仅有一个位为1时对应的10进制数为 1和2(enum不能指定10进制数为0),set可以多选所以set的5个bit位表示的10进制数的范围为0~31(set可以指定10进制数为0)。

        对于t10表,如果我们想查询爱好中含有song爱好的记录,怎么查询呢?

        通过简单的select语句查询出来的,只有爱好仅为song的记录,所以还有其他什么方法吗?有的,在set集合中,提供了fin_in_set的函数。

find_in_set函数

        在mysql集合查询中使用fin_in_set函数。find_in_set(substr,strlist),如果substr在strlist中,则返回substr对应的下标,不存在则返回0,图示如下。      

    使用find_in_set函数查询在表t10表中,字段hobby为song的所有记录。

        查询结果符合预期,需要注意的是如果查询的是某个表中的某个字段set集合,那么find_in_set函数的第一个参数为选项,第二个参数为表的字段名称。 

        以上便是MySQL数据库数据类型的所有内容。

        本期内容到此结束^_^ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

以棠~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值