• 【MySQL功法】第3话 · MySQL中常见的数据类型


    **??**写在前面


    最近读到一段话,感触颇深,于是打算在这篇正文之前略提一二,这句话是这么说的:**所有的成功,都是快乐的结果,而不是快乐的原因。**你做让自己快乐的事情,你才容易成功;你能做让自己快乐的事情,你就成功了。所以我想,可能现在的我并没有获得什么大成功,但我很快乐,那就让成功慢悠悠地到来吧。kiko愿望与各位一起,一同前行。

    言归正传,本章内容主要介绍了MySQL中的常见数据类型,快速理解后可以便于日后的记录操作!

    目录

    ??写在前面

    ??知识点5:MySQL的常见数据类型

    ??5.1?整型

    ??5.1.1 四类整型

    ??5.1.2 图形化创建表

    ??5.2?浮点型

    ??5.2.1?float型

    ??5.2.2?decimal型

    ??5.3?字符型

    ??5.3.1?char型

    ??5.3.2?varchar型

    ??5.3.3?text / longtext(4G) / blob / longblob(4G) 型

    ??5.4?枚举类型

    ??5.4.1?单选类型

    ??5.4.2?多选类型

    ??5.5?日期时间类型

    ??5.5.1?时间数据类型

    ??5.5.2?日期时间函数

    ??5.5.3?日期时间计算

    **??**知识点5:MySQL的常见数据类型


    MySQL的常见数据(注意是常见,这里没有介绍完整)类型主要有以下四大类,分别为数值类型、字符类型、枚举类型和日期时间类型。在学习过程中,我们需要掌握合适的用法,在实际设计时,去选择合适的数据类型进行存储数据,从而节约存储空间。

    ??5**.1整型**


    ??5.1.1 四类整型

    整型类型还能进一步继续分为四类(可以去和学过的最基本的C语言进行类比),如下表所示,不知各位有无注意细节,我将第一列加粗表示,此处将第一列作为该表的主键啦!

    数据类型

    内存占用

    无符号取值范围

    有符号取值范围

    int(大整型)

    4字节

    2^{32}-1

    -2^{31}sim 2^{31}-1

    tinyint(微小整型)

    1字节

    0~255

    -128~127

    smallint(小整型)

    2字节

    2^{16}-1

    -2^{15}sim 2^{15}-1

    bigint(极大整型)

    8字节

    2^{64}-1

    -2^{63}sim 2^{63}-1

    我们不难发现MySQL中的int型也存在有符号与无符号之分,那么在程序编写时具体有什么语法格式区别呢?我们来实操一下:

    #建一个《简单信息表》
    create table nt1(
    age tinyint unsigned,
    id  int,
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    我们在上面程序中定义_age字段_为无符号的微小整型,将id字段定义为有符号的大整型。可以发现,如果我们在数据类型的后边不额外加上_unsigned_,例如上面的 id int,系统将会默认在_int_后加一个_signed_以表示_id_字段是有符号的。


    ??5.1.2 图形化创建表

    在这里,我们再介绍一种图形化界面创建表的方法,通过鼠标点击的方式去创建一个表:

    **step1.**首先选中一个数据库进入,比如我这里选择的就是kiko这个数据库,然后点击【表】——>【新建表】。

    **step2.**通过点击表格与选中输入的方式,如果要输入多行数据,可以单击【添加字段】然后进行设置,当设置完各字段的数据类型后(如下图),点击【保存】,此时会跳出一个框,我们在框中输入这个表的名字,这里命名为nt1。

    **step3.**这时我们可以在左边状态栏中找到我们刚刚建立的nt1表,我们在表格中输入一些值,来检测一下无符号tinyint型的age字段,输入完毕后按【ctrl+s】保存。

    我是分割线

    ??5**.2浮点型**


    ??5.2.1float型

    用法:字段名 float(m,n)
    
    m:总位数(整数位位数+小数位位数)
    n:小数位位数
    
    • 1
    • 2
    • 3
    • 4

    **存储空间:**4字节

    **取值范围:**我们举个例子,比如我们想要在上面表格中添加一个score字段,将它设置为 float(5,2),其中5表示这里一共5位数,2表示小数位位数占2位,可以存储一个 -999.99 ~ 999.99的值,这个范围完全包括了正常考分的范围,因此可以满足要求。

    **致命缺陷:**float从左到右最多显示7个有效位(整数位+小数位),因此我们在定义时,m的最大赋值为7;我们同样可以通过一个例子清晰理解:


    ??5.2.2****decimal型

    用法:字段名 decimal(m,n)
    
    m:总位数(整数位位数+小数位位数)
    n:小数位位数
    
    • 1
    • 2
    • 3
    • 4

    **显示限制:**最多可以从左到右显示28个有效位(包括整数位和小数位)。

    **存储空间:**整数部分与小数部分分开存储,存储空间 = 整数部分所占字节数 + 小数部分所占字节数,其中关于字节数的计算是由专门算法进行计算。

    关于浮点型内容的注意点:

    (1)浮点型插入整数时会自动补全小数位位数;

    (2)小数位多于指定的位数时,会对下一位进行四舍五入的操作;我们可以沿用上边的score字段进行检测,由于score字段指定了小数位位数为2,因此我们在表格中输入一个3位小数,一起看看其最终的结果如何把!

    我们发现超出位数的小数自动四舍五入了,即将超出的第三位小数9四舍五入给了2,使其变为3。

    我是分割线

    ??5**.3字符型**


    ??5.3.1char型

    用法:char(定长)
    
    宽度取值范围:1 ~ 255(若不指定宽度,则默认宽度为1,存储1个字符)
    
    • 1
    • 2
    • 3

    ??5.3.2varchar型

    用法:varchar(变长)
    
    宽度取值范围:1 ~ 65535(必须指定宽度,无默认宽度值)
    
    • 1
    • 2
    • 3

    Q1:char和varchar有什么区别吗?
    **A1:**最明显的区别应当是它们在存储数据时的区别,比如我们为char和varchar的宽度都设置为10,这时假如我们在这里存储一个字符时,char会在字符后面补9个空格,而varchar则不补空格,就占字符长度的空间。

    于是我们就得到了_char_和_varchar_的一些不同点

    1. _char_放入小于指定宽度的字符时,会自动在字符后面补充空格;因此_char_类型浪费存储空间,但是性能高,这是因为开辟空间是按设定开辟,如上例中直接就开辟10个空间。
    2. _varchar_放入小于指定宽度的字符时,不补空格,就占字符长度的空间;因此_varchar_类型节省存储空间,但是性能低,这是因为_varchar_会专门计算一下存储字符的长度,所以是在用时间换空间。

    当然_char_和_varchar_也是有相同点的,那就是当输入字符超出指定宽度,都会存储失败。


    ??5.3.3text / longtext(4G) / blob / longblob(4G) 型

    用法:存储文本,无需指定宽度。
    
    • 1

    我是分割线

    ??5**.4枚举类型**


    ??5.4.1单选类型

    用法:字段名 enum (值1,值2,····)
    
    规则:只能选择其中某一个值。
    
    • 1
    • 2
    • 3

    当我们在设置一个人的性别时,这就是一个单选类型,就可以使用enum类型,如下图操作所示:


    ??5.4.2多选类型

    用法:字段名 set (值1,值2,····)
    
    规则:可以选择其中一个值或者同时选择多个值。
    
    • 1
    • 2
    • 3

    比如我们在设置一个人的兴趣爱好时,这就可以是一个多选类型,这时我们使用set类型,操作如下图所示:

    我是分割线

    ??5**.5日期时间类型**


    ??5.5.1时间数据类型

    date:" YYYY - MM - DD "                     (年-月-日)
    time: " HH : MM : SS "                       (时:分:秒)
    datetime: " YYYY - MM - DD HH : MM : SS "    (年-月-日 时:分:秒)
    timestamp: " YYYY - MM -DD HH : MM : SS "    (年-月-日 时:分:秒)
    
    • 1
    • 2
    • 3
    • 4

    Q1:datetime与timestamp类型有什么区别?

    **A1:**虽然它们两者都可以返回“年-月-日,时:分:秒”信息,但它们的区别在于其赋值后的状态,其主要区别是:

    • **datetime:**不赋值,就会返回NULL空值。
    • **timestamp:**不赋值,默认会返回系统当前时间。

    ??5.5.2日期时间函数

    1. now()          返回服务器当前时间
    2. curdate()      返回当前日期
    3. curtime()      返回当前时间
    4. year(date)     返回指定时间的年份
    5. date(date)     返回指定时间的日期
    6. time(date)     返回指定时间的时间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    关于上述函数的一般操作我们可以按照下图自己操作一遍,很简单:

    SELECT NOW();
    SELECT CURDATE();
    SELECT CURTIME();
    
    SELECT YEAR('2022-01-26 12:20:45');
    SELECT DATE('2022-01-26 12:20:45');
    SELECT TIME('2022-01-26 12:20:45');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7


    ??5.5.3日期时间计算

    格式:SELECT * FROM 表名 WHERE 字段名 运算符 (时间-INTERVAL 时间间隔单位)
    
    (1)运算符: >  =  < 
    
    (2)时间间隔单位: 1 day| 2 hour | 1 minute | 2 year | 3 month |···
    
    • 1
    • 2
    • 3
    • 4
    • 5

    接下来我们通过一个例子对上面的函数进行讲解,为了讲解方便,我们先在本章创建的表中插入一些数据,这样方便后期函数的使用。关于表记录的插入内容,我们在上一章中已经详细讲过,如果有所遗忘可以点击下方链接前往学习哦!

    【MySQL入门】第二话 · 数据库与数据表的基本操作[这里是图片021]https://kikoking.blog.csdn.net/article/details/125106100?spm=1001.2014.3001.5502

    我们现将表格中各条记录代码放在下面,各位可以直接复制进去进行插入哦!

    INSERT INTO nt1 (id,name,age,score,sex,hobby,birthday) VALUES ('01','张晓栋','23','70','男','唱歌,跳舞','1997-09-01');
    INSERT INTO nt1 (id,name,age,score,sex,hobby,birthday) VALUES ('02','蒋粤','22','90','男','跑步','1999-02-25');
    INSERT INTO nt1 (id,name,age,score,sex,hobby,birthday) VALUES ('03','周琦','23','85','女','弹琴,健身','2000-10-08');
    INSERT INTO nt1 (id,name,age,score,sex,hobby,birthday) VALUES ('04','宋颖','23','92','男','唱歌,跳舞,跑步','2001-06-07');
    
    • 1
    • 2
    • 3
    • 4

    例如我们想要查找上表中2000年前出生的学生记录,这时我们就要找到一个时间点,即现在的年份(2022)减去时间间隔22年后的值,birthday的年份时间应当比这个值小,才是2000年前的记录,因此使用“<”。

    SELECT * FROM nt1 WHERE birthday < (NOW()-INTERVAL 22 year);
    
    • 1

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    使用IDEA快速创建一个SpringBoot项目
    【indexedDB】indexedDB知识梳理
    边缘计算AI智能安防监控视频平台车辆违停算法详解与应用
    数据分析相关暂存
    10-18 查询同专业的学生(MSSQL)
    记录--怎么写一个可以鼠标控制旋转的div?
    JVM-类加载机制
    论文翻译1-----DSSM:Deep Structured Semantic Models
    【QT小记】QT中QString与常用字符编码转换
    vs2019+qgis+qt学习总结
  • 原文地址:https://blog.csdn.net/m0_67402564/article/details/126080627