🍺写在前面
最近读到一段话,感触颇深,于是打算在这篇正文之前略提一二,这句话是这么说的:所有的成功,都是快乐的结果,而不是快乐的原因。你做让自己快乐的事情,你才容易成功;你能做让自己快乐的事情,你就成功了。所以我想,可能现在的我并没有获得什么大成功,但我很快乐,那就让成功慢悠悠地到来吧。kiko愿望与各位一起,一同前行。
言归正传,本章内容主要介绍了MySQL中的常见数据类型,快速理解后可以便于日后的记录操作!
目录
🥝5.3.3 text / longtext(4G) / blob / longblob(4G) 型
MySQL的常见数据(注意是常见,这里没有介绍完整)类型主要有以下四大类,分别为数值类型、字符类型、枚举类型和日期时间类型。在学习过程中,我们需要掌握合适的用法,在实际设计时,去选择合适的数据类型进行存储数据,从而节约存储空间。
🍯5.1 整型
🥝5.1.1 四类整型
整型类型还能进一步继续分为四类(可以去和学过的最基本的C语言进行类比),如下表所示,不知各位有无注意细节,我将第一列加粗表示,此处将第一列作为该表的主键啦!
数据类型 内存占用 无符号取值范围 有符号取值范围 int(大整型) 4字节 tinyint(微小整型) 1字节 0~255 -128~127 smallint(小整型) 2字节 bigint(极大整型) 8字节 我们不难发现MySQL中的int型也存在有符号与无符号之分,那么在程序编写时具体有什么语法格式区别呢?我们来实操一下:
#建一个《简单信息表》 create table nt1( age tinyint unsigned, id int, )ENGINE=InnoDB DEFAULT CHARSET=utf8;我们在上面程序中定义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.1 float型
用法:字段名 float(m,n) m:总位数(整数位位数+小数位位数) n:小数位位数存储空间: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:小数位位数显示限制:最多可以从左到右显示28个有效位(包括整数位和小数位)。
存储空间:整数部分与小数部分分开存储,存储空间 = 整数部分所占字节数 + 小数部分所占字节数,其中关于字节数的计算是由专门算法进行计算。
关于浮点型内容的注意点:
(1)浮点型插入整数时会自动补全小数位位数;
(2)小数位多于指定的位数时,会对下一位进行四舍五入的操作;我们可以沿用上边的score字段进行检测,由于score字段指定了小数位位数为2,因此我们在表格中输入一个3位小数,一起看看其最终的结果如何把!
我们发现超出位数的小数自动四舍五入了,即将超出的第三位小数9四舍五入给了2,使其变为3。
✨✨✨我是分割线✨✨✨
🍯5.3 字符型
🥝5.3.1 char型
用法:char(定长) 宽度取值范围:1 ~ 255(若不指定宽度,则默认宽度为1,存储1个字符)
🥝5.3.2 varchar型
用法:varchar(变长) 宽度取值范围:1 ~ 65535(必须指定宽度,无默认宽度值)Q1:char和varchar有什么区别吗?
A1:最明显的区别应当是它们在存储数据时的区别,比如我们为char和varchar的宽度都设置为10,这时假如我们在这里存储一个字符时,char会在字符后面补9个空格,而varchar则不补空格,就占字符长度的空间。于是我们就得到了char和varchar的一些不同点:
- char放入小于指定宽度的字符时,会自动在字符后面补充空格;因此char类型浪费存储空间,但是性能高,这是因为开辟空间是按设定开辟,如上例中直接就开辟10个空间。
- varchar放入小于指定宽度的字符时,不补空格,就占字符长度的空间;因此varchar类型节省存储空间,但是性能低,这是因为varchar会专门计算一下存储字符的长度,所以是在用时间换空间。
当然char和varchar也是有相同点的,那就是当输入字符超出指定宽度,都会存储失败。
🥝5.3.3 text / longtext(4G) / blob / longblob(4G) 型
用法:存储文本,无需指定宽度。
✨✨✨我是分割线✨✨✨
🍯5.4 枚举类型
🥝5.4.1 单选类型
用法:字段名 enum (值1,值2,····) 规则:只能选择其中某一个值。当我们在设置一个人的性别时,这就是一个单选类型,就可以使用enum类型,如下图操作所示:
🥝5.4.2 多选类型
用法:字段名 set (值1,值2,····) 规则:可以选择其中一个值或者同时选择多个值。比如我们在设置一个人的兴趣爱好时,这就可以是一个多选类型,这时我们使用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 " (年-月-日 时:分:秒)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) 返回指定时间的时间关于上述函数的一般操作我们可以按照下图自己操作一遍,很简单:
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');
🥝5.5.3 日期时间计算
格式:SELECT * FROM 表名 WHERE 字段名 运算符 (时间-INTERVAL 时间间隔单位) (1)运算符: > = < (2)时间间隔单位: 1 day| 2 hour | 1 minute | 2 year | 3 month |···接下来我们通过一个例子对上面的函数进行讲解,为了讲解方便,我们先在本章创建的表中插入一些数据,这样方便后期函数的使用。关于表记录的插入内容,我们在上一章中已经详细讲过,如果有所遗忘可以点击下方链接前往学习哦!
我们现将表格中各条记录代码放在下面,各位可以直接复制进去进行插入哦!
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');例如我们想要查找上表中2000年前出生的学生记录,这时我们就要找到一个时间点,即现在的年份(2022)减去时间间隔22年后的值,birthday的年份时间应当比这个值小,才是2000年前的记录,因此使用“<”。
SELECT * FROM nt1 WHERE birthday < (NOW()-INTERVAL 22 year);