**??**写在前面
最近读到一段话,感触颇深,于是打算在这篇正文之前略提一二,这句话是这么说的:**所有的成功,都是快乐的结果,而不是快乐的原因。**你做让自己快乐的事情,你才容易成功;你能做让自己快乐的事情,你就成功了。所以我想,可能现在的我并没有获得什么大成功,但我很快乐,那就让成功慢悠悠地到来吧。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;
- 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_的一些不同点:
- _char_放入小于指定宽度的字符时,会自动在字符后面补充空格;因此_char_类型浪费存储空间,但是性能高,这是因为开辟空间是按设定开辟,如上例中直接就开辟10个空间。
- _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
接下来我们通过一个例子对上面的函数进行讲解,为了讲解方便,我们先在本章创建的表中插入一些数据,这样方便后期函数的使用。关于表记录的插入内容,我们在上一章中已经详细讲过,如果有所遗忘可以点击下方链接前往学习哦!
我们现将表格中各条记录代码放在下面,各位可以直接复制进去进行插入哦!
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开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦