• MySQL-数据类型


    数值类型

    数据类型说明
    bit(M)位类型。M指定位数,默认值为1,范围1-64.
    tinyint [unsigned]带符号范围:-128 - 127,无符号范围: 0 - 255
    bool使用0和1表示假和真
    smallint [unsigned]带符号范围:-2^15 - 2^15 - 1,无符号范围:0 - 2^16 - 1
    mediumint [unsigned]带符号范围:-2^23 - 2^23 - 1,无符号范围:0 - 2^24 - 1
    int [unsigned]带符号范围:-2^31 - 2^31 -1,无符号范围:0 - 2^32 - 1
    double [unsigned]带符号范围: -2^63 - 2^63 - 1,无符号范围: 0 - 2^64 - 1
    float[(M,D)] [unsigned]M表示显示长度,D表示小数点的位数,占用4字节
    double[(M,D)] [unsigned]精度比float更高的浮点数,占用8字节
    decimal[(M,D)] [unsigned]M指定长度,D表示显示小数的位数

    bit

    🚀bit[M]:M表示使用的比特位数,范围为1-64,bit位在显示的时候是按照Ascll码来显示的。
    在这里插入图片描述

    insert into t1 values(10);
    insert into t1 values(11);
    insert into t1 values(12);
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    可以看到插入的三个数据是显示不出来的,那是因为Ascll值为10 11 12的字符为不可显字符。插入48那么显示出来就为‘0’;
    在这里插入图片描述

    tinyint

    🚀tinyint占用1个字节,对于有符号而言取值范围是-128 - 127。无符号的范围是0 - 255。当用户在插入数据超出其所表示的范围后会拦截我们插入。
    在这里插入图片描述

    insert into t2 values(127,255);
    insert into t2 values(-128,255);
    
    • 1
    • 2

    在这里插入图片描述

    mysql会对非法数据进行拦截

    insert into t2 values(128,0);
    
    • 1

    在这里插入图片描述

    float

    🚀float[(M,D)], M:显示长度,D:指定小数位数。

    • 例如float(4,2)所能表示的范围就是(-99.99 - 99.99),如果用unsigned修饰那么范围就是(0 - 99.99)在插入数据时会四舍五入.
    insert into t3 values(-99.99);
    insert into t3 values(99.99);
    insert into t3 values(99.994);
    insert into t3 values(-99.994);
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    同样当超出其能表示的范围后也会对我们的插入做拦截。
    在这里插入图片描述

    decimal

    🚀decimal的用法与float一样,与float的区别是decimal比float更加精确。

    insert into t4 values(14.1234567,14.1234567);
    
    • 1

    在这里插入图片描述
    🚀float的精度大约是7位,对于decimal而言,支持的最大整数位数65位,支持的最大小数位数30位。decimal(M,D)默认情况下M的值为10,D的值为0。
    🚀float和double是采用标准的浮点数存储形式,decimal实际存储的是字符串。

    字符串和文本类型

    数据类型说明
    char(size)固定长度字符串,size的最大值为255
    varchar(size)可变长度字符串,最大长度为65535字节
    blob二进制数据
    text大文本,不支持全文索引,不支持默认值

    char

    🚀char(size):size的最大值为255,表示char字符串最多存储255个字符(注意是字符不是字节)

    在这里插入图片描述
    char(2)表示能够存储两个字符。

    insert into t5 values('ab');
    insert into t5 values('张三');//utf8编码规则下一个中文字符占用3个字节
    
    • 1
    • 2

    在这里插入图片描述

    varchar

    🚀varchar(size)是变长字符串,当实际字符串长度小于size时,那么占用的空间以实际varchar长度为准。注意:这里的size指的是字节

    • varchar的长度为0-65535之间的值,但是其中要占用1-3字节来记录实际varchar的长度,所以varchar的实际可用长度最大为65532字节。
    • 那么,在不同的编码规则下,varchar所能存储的字符数量也是不同的,例如在utf8编码规则下一个字符占用3字节,所以varchar可存储的最大字符数为 65532 / 3。在gbk编码规则下一个字符占用2字节,所以varchar可存储的最大字符数为65532 / 2。

    varchar和char该如何选择呢?

    1.当存储一些定长的数据的时候,例如身份证号,手机号,学号等等,最好使用定长字符串。
    2.当存储的数据长度不定的时候,例如名字,家庭住址,商品名称等等,最好使用变长字符串。
    3.定长字符串IO效率高。
    4.变长字符串IO效率低。

    blob

    🚀例如,在持久化存储的时候,通常都要对结构化数据进行序列化,将序列化后的数据进行持久化存储,序列化的工具有很多,Json,protobuf等等,使用protobuf序列化的结果就是二进制数据,此时就可以使用blob数据类型来存储。

    text

    🚀当存储一些大的文本数据时,就可以使用text数据类型,text数据类型不支持全文索引,不支持默认值。

    日期和时间类型

    🚀常用的时间类型有以下三种:

    • date:‘yyyy-mm-dd’,表示年月日,占用3字节。
    • datatime:‘yyyy-mm-dd HH:ii:ss’,表示年月日时分秒,表示范围1000-9999,占用8字节。
    • timestamp:时间戳,从1970年至今的秒数,表示的格式与datatime一致,占用4字节。

    注意: 时间戳形式的数据在插入时不用显示的插入数据,系统会自动填入此时的时间戳,并且在进行更新数据时,时间戳数据也会自动更新。

    在这里插入图片描述

    insert into t7(birthday,time) values('2000-01-01','2000-01-01 15:15:15');
    
    • 1

    在这里插入图片描述

    update t7 set time='2020-10-01 09:00:00';
    
    • 1

    在这里插入图片描述
    可以看到更新数据时,时间戳字段也会自动更新。

    enum-枚举类型

    🚀enum类型,多选一,在实际存储的时候只会存储众多选项中的 某一个值。而处于效率考虑,这些值实际存储时存储的是‘数字’,枚举常量中的每个值对应 1…,最大到65535个,所用插入枚举值的时候,不仅可以使用枚举值也可以使用其对应的数字。

    🚀例如,在表示性别的时候,就可以使用enum类型。

    create table t8 ( sex enum('男','女') );
    
    • 1

    在这里插入图片描述

    insert into t8 values('男');
    insert into t8 values(1);
    
    • 1
    • 2

    在这里插入图片描述
    可以看到,无论插入’男’还是1,结果都是一样的。

    set-集合类型

    🚀set类型,支持多选一,多选多,当然也可以不选填入NULL值。同样,实际集合类型存储的也是‘数字’,集合中的每个选项对应1,2,4,8…,最多64个。可以理解为每个二进制位对应一个选项。在插入时同样可以使用数字。(无论枚举还是集合,不建议使用数字的形式,不易阅读)。

    例如,描述一个人爱好的时候,就可以使用集合类型,比如一个人的爱好有抽烟,喝酒,烫头。

    create table t10 ( id int, hobby set('跑步','游泳','篮球','足球','排球','骑行'));
    
    • 1

    在这里插入图片描述

    insert into t10 values(1,'篮球,跑步,游泳'),(2,'篮球,排球,足球'),(3,'骑行,跑步,足球,游泳'),(4,'游泳');
    
    • 1

    在这里插入图片描述
    🚀查询时可以使用名称和数字都可以。
    在这里插入图片描述
    在这里插入图片描述

    7 = 1 + 2 + 4 :表示爱好为跑步,游泳,篮球的人。

    面临的问题:例如,我们想查询出爱好有篮球的人,使用hobby=‘篮球’是不对的(这个意思是爱好只有篮球的人),可以借助find_in_set(sub,list)函数来完成。如果sub在list中返回其下标(从1开始),不在就返回0。

    在这里插入图片描述

    select * from t10 where find_in_set('篮球',hobby);
    
    • 1

    在这里插入图片描述

    🚀选出爱好有骑行或者有游泳的人。

    select * from t10 where find_in_set('骑行',hobby) or find_in_set('游泳',hobby);
    
    • 1

    在这里插入图片描述

  • 相关阅读:
    WinRAR如何保护压缩包的文件不被修改
    Java 21 新特性:Record Patterns
    Buffer 与 拥塞控制
    南大通用数据库-Gbase-8a-学习-19-Gbase8a从Kafka订阅Topic消费数据
    Mybatis
    [学习笔记]Linux + Nginx环境下部署 Web 站点
    JavaScript面试题整理(二)
    推荐一份适合所有人做的副业,尤其是程序员!
    从服务器指定位置下载文件
    《微信小程序开发从入门到实战》学习十七
  • 原文地址:https://blog.csdn.net/Djsnxbjans/article/details/132591935