• 3.MySQL数据类型详解


    个人主页:Lei宝啊 

    愿所有美好如期而遇


    1.数据类型分类

    数值类型:bit 

                      tinyint  smalliint  int  bigint  

                      float  double  decimal 

                      bool

    文本,二进制类型:

                      char

                      varchar

                      text

    时间日期:date  datetime  timestamp

    String类型:

                      enum

                      set

    2.数值类型

    (1).tinyint,smallint类型等

    事实证明,mysql不允许不合法的数据插入,-129和128超出了tinyint的范围。

    接下来我们测试一下无符号tinyint的范围。

     显然,变成了0~255.

    (2)bit类型

    bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1

    我们发现竟然什么都没有,为什么呢?

    bit字段在显示时,是按照ASCII码对应的值显示

    先将num的范围改大点

    (3)小数类型

    1).float

    float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节

    小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入 

    我们先不指定宽度和小数位数。

    可以看出默认6位小数,再多就会丢失精度。

    接下来指定一下宽度和精度。

    99.9954进位后就是100.00,超出宽度,数据不合法,数据库不允许插入,精度一定会保持两位,哪怕是补两个0.

    这样也可以。 

    接下来看一下无符号float

    于是我们知道了,float(4,2) unsigned 类型的数据范围只有0~99.99

    2).decimal

    decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数

    decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,
    默认是10。
    建议:如果希望小数的精度高,推荐使用decimal。

    decimal的精度很高,基本上插入几就是几,float丢失精度就比较多了。

    3.字符串类型

    (1)char

    char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255

    注意:utf8中一个字符占3个字节,而gbk中一个字符占2个字节 

    这里的一个字符可以是数字,字母,符号和汉字,都是一个字符。

    (2)varchar

    varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节

     

    关于varchar(len),len到底是多大,这个len值,和表的编码密切相关: 

    varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字
    节数是65532。
    当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占
    用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符
    占用2字节)。

    (3)char和varchar比较

    如何选择定长或变长字符串?

    如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
    如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
    定长的磁盘空间比较浪费,但是效率高。
    变长的磁盘空间比较节省,但是效率低。
    定长的意义是,直接开辟好对应的空间
    变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。

    (4)日期和时间类型

    date            :日期 'yyyy-mm-dd' ,占用三字节
    datetime    :时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
    timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一                              致, 占用四字节

    先插入一个date类型的数据。

    emmm?我们没插入timestamp类型的数据啊,为什么呢?这是因为他有default值,也就是默认值,当我们不插入时,默认插入现在的时间。而且就算你刻意插入NULL,插不进去,因为他不允许为空。

     

    而且时间戳会自动更新当前时间。

    (5)enum和set

    enum:枚举,“单选”类型;
    enum('选项1','选项2','选项3',...);

    不可插入多个选项。

    set:集合,“多选”类型;
    set('选项值1','选项值2','选项值3', ...); 

    再插入几个数据。

    将set里的选项当做比特位,a就是1,a,b就是11,a,b,c就是111,转换为十进制就是1,3,7

    再来看一个。

    这样也是可以的。

    但是我们也想找包含‘a’的所有项,怎么找?

    集合查询使用find_ in_ set函数:
    find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0

    首先select可以执行表达式和函数。

    非0为true,而且我们看到这个函数只能查找单个字符。

    这样我们就筛选出了所有爱好为a的人。

    那么如何筛选爱好为a,b的人呢?

    用and连接就好了。

    综合举个栗子

    先建个新表。

    不可以这样查找。

    这样查可以,但是不能够包含。

  • 相关阅读:
    庆金秋贺国庆 | 实验必备「取样一本通•植物篇」包邮免费送!
    多线程调用外部接口
    SaaS vs 低代码,谁在成为中国产业服务的楔子?
    Netty入门案例 与 Netty异步模型
    基于springboot会员制医疗预约服务管理信息系统springboot017
    Abp 实现通过手机号注册用户
    4G LTE教程
    【图像配准】基于surf算法实现图像配准附Matlab代码
    Atlassian午餐会直播回顾:如何在Jira中进行项目时间与成本管理?
    QT实现TCP服务器客户端搭建的代码,现象
  • 原文地址:https://blog.csdn.net/m0_74824254/article/details/133808052