【MySQL】数据库中这么多数据类型你真的了解吗?一文看懂不同数据类型有何区别

一、常见数据类型

在这里插入图片描述

二、数值类型

在这里插入图片描述

2.1 整型

  1. 创建表t1,将name列数据类型设置为要tinyint
    在这里插入图片描述
  2. 插入属性值:由于这里是tinyint类型,取值范围是【-128–127】,当插入这个范围内的数据显示成功,范围之外失败
    在这里插入图片描述
  3. 使用tinyint unsigned类型创建表t2
    在这里插入图片描述
    无符号类型取值范围【0,255】,这点与C/C++一样

2.1.1 小结

  • MySQL对于数据类型不合法行为采取直接报错,阻止我们继续操作
  • 这也说明了我们插入表里面的数据一定是合法的
  • 在MySQL中,数据类型本身也是一种约束:逼着程序员合法使用,保证数据库中的数据是可预期,完整的
  • 创建表的时候,使用无符号类型需要在后面定义,这点与C/C++不同

其余整型使用方法和约束与tinyint一样

2.2 bit类型

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

  1. 创建表t3
    在这里插入图片描述

  2. 插入数据
    在这里插入图片描述
    可以发现插入2的时候报错,这是因为2无法用1个bit位表示;
    查表发现,gender没有显示任何属性,这是因为bit类型的数据默认以ASCLL码显示,但是ASCLL码0、1不可见,可以通过select id,hex(gender) from t3;进行十进制查看
    在这里插入图片描述

  3. 修改列的属性
    在这里插入图片描述

  4. 修改列的属性
    将gender列bit位改为10位,插入
    在这里插入图片描述
    对比之下可以发现:bit字段在显示时,是按照ASCII码对应的值显示
    在这里插入图片描述

2.3 float 类型

float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。

这里我创建了一个表t4:要求其salary字段是float类型,并且显示长度为4,小数位数为2
在这里插入图片描述
在这里插入图片描述
无符号测试
这里我在表t4的基础上增加一个字段aneno,并将其设置为无符号float类型
在这里插入图片描述
通过上图可以发现。无符号类型的float,负数是无法插入的

2.4 decimal类型—精度更高

decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
decimal使用方法和限制条件与float一样,唯一不同的就是精度方面
在这里插入图片描述
float表示的精度大约是7位
decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,
默认是10。(不同平台精度或许不用,仅供参考)

三、字符串类型

3.1 char—固定字符串

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

创建一个表t5将其name字段设置为两个字符,插入英文字符与中文字符实验结果如下
在这里插入图片描述

结论:

  1. char数据类型本身与前面几种一样带有约束(越界报错)
  2. 与C/C++语言中一个字符占一个字节不一样,在GBK中一个汉字占两个字节,UTF-8中一个汉字占三个字节,但是 在mysql中,一个汉字就是一个字符
  3. 由于char固定长度最大为255,建表的时候超过这个数会直接报错

3.2 varchar—变长字符串

varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节,在不同编码中,L的最大长度不同,utf-8中最大是是21845

创建表t7,name字段设置为4个字符,使用方法和char一样在这里插入图片描述

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

3.2.1 char和varchar区别

在这里插入图片描述
根据需求,合理选择char/varchar
如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5(密码摘要)
如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
定长的磁盘空间比较浪费,但是效率高。
变长的磁盘空间比较节省,但是效率低。

定长的意义是,直接开辟好对应的空间
变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。

3.3 日期和时间类型

常用的日期有如下三个:

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

创建表t8,带有三个字段,分别是日期、日期时间、时间戳;前两个字段需要传入,时间戳不需要
在这里插入图片描述
更新数据或新插入数据,时间戳也会被改变,如下图
在这里插入图片描述
日期时间类型适用于不需要改变时间的场景:上下班打卡
时间戳类型适应于频繁改变时间场景:发帖子

3.4 enum和set

enum:枚举,“单选”类型;enum(‘选项1’,‘选项2’,‘选项3’,…);
set:集合,“多选”类型;set(‘选项值1’,‘选项值2’,‘选项值3’, …);


有一个调查表,需要调查人的喜好, 比如(唱,跳,rap,篮球)中去选择(可以多选),(男,女)[单选]

enum插入可以选择直接用枚举常量,也可以选择常量下标,但是注意,枚举常量下标默认从1开始;对于非枚举常量,mysql直接报错
在这里插入图片描述


set插入特点:可以直接用选项值,也可以用数字,但是插入的数据必须是集合里面的

在这里插入图片描述


使用数字进行插入,结合linux权限理解
在这里插入图片描述


这个数字使用位图来表示的,比如以上爱好中全选对应的位图结构就是1111(15)
在这里插入图片描述

3.4.1 set查询----find_in_set

find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0;
str_list 用逗号分隔的字符串。


绝对查询:结果是只含有特定字段的信息,如:select * from t9 where hobby='唱';
在这里插入图片描述

查询包含有特定字段的的信息
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_54469145/article/details/131141708