datetime数据类型_MySQL萌新第一季 第五话-数据类型和运算符

本话旨在完成以下内容
上话我们已经学过了表的创建、修改和删除等问题。其实上话只学习了关于表的表头问题,至于向表里面添加内容,我们以后才会学习。表是由多个字段构成,而每个字段指定了不同的数据类型。指定字段的数据类型之后,也就决定了向字段插入的数据内容。比如我们有个字段是age,这个年龄字段你设置数据类型应该是INT,而不会设置成VARCHAR。其实这和Java等语言的数据类型相似。本话我们就学习MySQL相关的数据类型。
内容导航:
1.前言
2.熟悉常见数据类型的概念和区别
3.掌握如何选择数据类型
4.熟悉常见运算符的概念和区别
5.掌握总和案例中运算符的运用方法
6.课后习题及答案
7.温故而知新

1.前言

2.熟悉常见数据类型的概念和区别

MySQL支持多种数据类型,主要有数值类型、日期/时间和字符串类型。

1.数值数据类型:包括整数类型TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、浮点小数数据类型FLOAT和DOUBLE,定点小数类型DECIMAL。

2.日期/时间类型:包括YEAR、TIME、DATE、DATETIME和TIMESTAMP。

3.字符串类型:包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等。字符串类型又分为文本字符串和二进制字符串。

1.整数类型

数值型数据类型主要用来存储数字,MySQL提供了多种数值类型,不同的数据类型提供不同的取值范围,可以存储的值范围越大,其所需要的存储空间也会越大。MySQL提供的数值型数据类型中其中整数类型有:TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、BIGINT。整数类型的属性字段可以添加AUTO_INCREMENT自增约束条件。

5bf31daf5bfa4f9f03108287db86a5d4.png

上表可知不同类型整数存储所需字节不同。我们可以根据占用字节数求出每一种数据类型的取值范围,例如TINYINT需要1个字节(8bits)来存储,那么TINYINT无符号数的最大值为2的8次方-1,即255;INYINT有符号数的最大值为2的7次方-1,即127。

3f3d8836848751021870dbf5778db8a0.png
上面红字说明有误,是0-255

我们这里有个字段为year INT(4),其实这句话除了括号里面的4,其他的大家都很明白。就是year这个字段的类型是INT,不声明就默认为有符号位。此时大家也就知道这个year的范围了。

但是!!为什么这里有个4,??这个4对于这个year的取值范围没有任何关系,其就是4个字节的取值范围。括号里是5,是6都与year这个字段的取值范围无关。

那这个4是什么?感觉没用啊!!也不是,比如你向year这个字段存的数字小于4位数,如199,那么其实MySQL里面存的是空格199;如果你存的是18,那么检索出来是空格空格18;如果你存的数大于等于4位数,只要在INT的范围内,则这个括号里的4不起任何作用。

这么说你可能还不明白,其实我也有点迷糊。但是问题我总会解决的,我们继续学吧!

忘了说了,这个数字叫显示宽度。对于整型数据类型是可以定义这个显示宽度的。如果不指定,则系统为每一种类型指定默认的宽度值。

93f7b13d564bd994160463af4eb6a95e.png
再如TINYINT有符号数和无符号数的取值范围分别是-128~127和0~255,由于负号占了一个数字位,因此TINYINT默认的显示宽度为4.即显示宽度默认值要能包含住这个数据类型的最大值。

注意:显示宽度只用于显示,并不能限制取值范围和占用空间,如:INT(3)会占用4个字节的存储空间。不管显示宽度时几(当然你不会写超过11的数字),都不会影响该字段的取值范围。显示宽度只是用来当数据位数小于显示宽度时,MySQLQ在其前面补空格存储。

2.浮点数类型和定点数类型

上面我们讲了整数,可是数据类型还要有小数啊。MySQL中使用浮点数和定点数来表示小数。

这里我也没有看懂,尤其是浮点数和定点数的区别。后续我们再补充。

9aa16c8faa300407864f48511bec8ec3.png

2690df4639356a9a4c09c0ddac9e0092.png

c82a978357f7283d567d2012ff5ccdd2.png

dfd8435a7d73c7ec4555a5f661156a09.png

3.日期与时间类型

MySQL中有多种表示日期的数据类型,主要有:YEAR、TIME、DATE、DATETIME、TIMESTAMP。每一个类型都有合法的取值范围,当指定确实不合法的值时系统将“零”值插入到数据库中。

38d43a633b203d2c70344017a3afc238.png

1.YEAR

YEAR类型存储时只需要1个字节。可以使用各种格式指定YEAR值。如下所示:

(1)以4位字符串或者4位数字格式表示的YEAR,范围为'1901'~'2155'。输入格式为'YYYY'或者YYYY,例如,输入'2010'或者2010。插入到数据库的值均为2010。

(2)以2位字符串格式表示的YEAR,范围为'00'到'99'。'00'~'69'和'70'~'99'范围的值分别被转化为2000~2059和1970~1999范围的YEAR值。'0'与'00'的作用相同。插入超过取值范围的值将被转换为2000。

(3)以2位数字表示的YEAR,范围1~99。1~69和70~99范围的值分别被转化为2001~2069和1970~1999范围的YEAR值。注意:在这里0值被转化为0000,而不是2000。

9c275560bd73c38545d990c0fff1c563.png
4位字符串或4位数字插入

4cbce38247c983257811e9f6ab15aaa3.png
2位字符串和1位字符串

b4716721c32cdc1cbe0d6e2fdd0d5c6c.png
添加2位数字或1位数字

f0047fbb7be9f248e89505cd598166a0.png
就没3位啥事

2.TIME

TIME在存储时需要3个字节。格式为'HH:MM:SS'。取值范围为-838:59:59~838:59:59。有人问小时部分怎么大于24了?因为这里可没说是记录的不一定是一天哦!我们可以使用各种格式指定TIME值,如下所示:

(1)'D HH:MM:SS'格式的字符串。还可以使用下面任何一种'非严格'的语法:'HH:MM:SS'、'HH:MM'、'D HH:MM'、'D HH'或'SS'。这里的D表示日,可以取0~34之间的值。在插入数据库时,D被转换为小时保存,格式为"D*24+HH"。

(2)'HHMMSS'格式的、没有间隔符的字符串或者HHMMSS格式的数值,假定是有意义的时间。例如:'101112'被理解为'10:11:12',但'109712'是不合法的(它有一个没有意义的分钟部分,超过59),存储时变位00:00:00。

提示:为TIME列分配简写值时应注意:如果没有冒号,MySQL解释值时,假定最右边的两位表示秒。(MySQL解释TIME值为过去的时间而不是当天的时间)例如,读者可能认为'1112'和1112表示11:12:00(即11点过12分),但MySQL将它们解释为00:11:12(即11分12秒)。同样'12'和12被解释为00:00:12。相反,TIME值中如果使用冒号则肯定看作当天的时间。也就是说,'11:12'表示11:12:00,而不是00:11:12。

这里创建还有类型为TIME的字符安t的表tmp4,并向表中插入字符串类型的几个数据。

29f8ec859bb439c68cb41ed6c1c84643.png
选库建表

f07c1d78e95d7b069f4f26d38909b174.png
插入数据

c7c3b9a74a1b54332c5459dc52db2974.png
注意事项

向表tmp4中插入'101112',111213,'0',107010

2c57b4d407b58f8c78758049214374c6.png
这是用个第二种方式没有间隔的字符串或数字插入

也可以使用系统日期函数向TIME字段列插入值(后面才会学习)

e566a6e18db81fb95f23b0a97512b002.png

3.DATA类型

DATE类型用在仅需要日期值时,没有时间部分,在存储时需要3个字节。日期格式为'YYYY-MM-DD'其中YYYY表示年;MM表示月;DD表示日。在给DATA类型的字段赋值时,可以使用字符串类型或数字类型的数据插入,只要符合DATE的日期格式即可。

1.以'YYYY-MM-DD'或'YYYYMMDD'字符串格式表示的日期,取值范围为'1000-01-01'~'9999-12-3'。例如输入'2012-12-31'或者'20121231',插入数据库的日期都为2012-12-31。

2.以'YY-MM-DD'或者'YYMMDD'字符串格式表示的日期,或以YY-MM-DD或者YYMMDD字符串格式表示的日期。MySQL使用以下规则解释数值。在00~69范围的年值转换为'2000~2069';'70~99'范围的年值转换为'1970~1999'。

3.使用CURRENT_DATE或NOW(),插入当前系统日期。

5a67812db8f3af60caefd2db75284a7c.png
用第一种方式插入日期

08879662f56127e98a11d24128966138.png
用第二、三种方式插入日期,大家注意到用第三种方式插入时有个警告。这可能是由于CURRENT_DATE只返回当前日期值,不包括时间部分;NOW()函数返回日期和时间值,在保存到数据库时,只保留了日期部分。我们这里只要日期值,这个警告可能和NOW()返回时间值有关

注:MySQL允许不严格语法:任何标点符号都可以用作日期部分之间的间隔符。例如,'98-11-31'、'98.11.31'、'98/11/31'和'98@11@31'是等价的,这些值也可以正确地插入到数据库。

4.DATETIME

DATETIME类型用在需要同时包含日期和时间信息的值,在存储时需要8个字节。日期格式为'YYYY-MM-DD HH:MM:SS'。在给DATETIME类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合DATETIME的日期格式即可。

1.以'YYYY-MM-DD HH:MM:SS'或者'YYYYMMDDHHMMSS'字符串格式表示的值,取值范围为'1000-01-01 00:00:00'~'9999-12-3 23:59:59'。

2.以'YY-MM-DD HH:MM:SS'或者'YYMMDDHHMMSS'字符串格式表示的值。与前面相同,'00~69'范围的年值转换为'2000~2069';'70~99'范围的年值转换为'1970~1999'。

3.以YYYYMMDDHHMMSS或者YYMMDDHHMMSS数字格式表示的日期和时间。

实例略...

提示:MySQL允许不严格语法:任何标点符号都可以用作日期部分或时间部分之间的间隔符。例如,'98-12-31 11:30:45'、'98.12.31 11+30+45'、'98/12/31 11*30*45'和'98@12@31 11^30^45'是等价的,这些值都可以正确地插入数据库。

5.TIMESTAMP

TIMESTAMP的显示格式与DATETIME相同,显示宽度固定在19个字符,日期格式为YYYY-MM-DD HH:MM:SS,在存储时需要4个字节。但是TIMESTAMP列的取值范围小于DATETIME的取值范围,为'1970-01-01 00:00:01' UTC~ '2038-01-19 03:14:07' UTC,其中UTC为世界标准时间,因此在插入数据时,要保证在合法的取值范围内。

创建数据表tmp7,定义数据类型为TIMESTAMP的字段ts,向表中插入值'19950101010101','950505050505','1996-02-02 02:02:02','97@03@03@03@03@03',121212121212,NOW()

1d02ff17ac9560f3ac8fb1e71cba8e41.png
建表

4076987d4dd5ec523c664354b4b1734a.png
插入数据

提示:TIMESTAMP与DATETIME除了存储字节和支持的范围外,还有一个最大的区别就是:DATETIME在存储日期数据时,按实际输入的格式存储,即输入什么就存储什么,与时区无关;而TIMESTAMP值的存储是以UTC(世界标准时间)格式保存的,存储时对当前时区进行转换,检索时再转换回当前时区。即查询时,根据当前时区的不同,显示的时间值是不同的。

提示:如果为一个DATETIME或TIMESTAMP对象分配一个DATE值,结果值的时间部分被设置为'00:00:00',因为值未包含时间信息。如果为一个DATE对象分配一个DATETIME或TIMESTAMP值,结果值的时间部分被删除,因为DATE值未包含时间信息。

4.文本字符串类型

字符串类型用来存储字符串数据,除了可以存储字符串数据之外,还可以存储其他数据,比如图片和声音的二进制数据。MySQL支持两类字符型数据:文本字符串和二进制字符串。其中文本字符串类型指CHAR、VARCHAR、TEXT、ENUM和SET。(文本字符串可以进行区分或不区分大小写的串比较,另外,还可以进行模式匹配查找。不过这都是后话了)

bcb8623a8839d1e3af6f25a0f9e35362.png

VARCHAR和TEXT类型与下一节讲到的BLOB一样是变长类型,对于其存储需求取决于列值的实际长度(在前面的表格中用L表示),而不是取决于类型的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储需求是字符串的长度L,加上1个字节以记录字符串的长度。对于字符'abcd',L是4而存储要求是5个字节。本章节介绍了这些数据类型的作用以及如何在查询中使用这些类型。

1.CHAR和VARCHAR类型

CHAR(M)为固定长度字符串,在定义时指定字符串列长。当保存时在右侧填充空格以达到指定的长度。M表示列长度,M的范围是0~255个字符。例如,CHAR(4)定义了一个固定长度的字符串列,其包含的字符个数最大为4.当检索到CHAR值时,尾部的空格将删除掉。

VARCHAR{M)是长度可变的字符串,M表示最大列长度。M的范围是0~65 535。VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,而其实际占用的空间为字符串的实际长度加1。例如VARCHAR(50)定义了一个最大长度为50的字符串,如果插入的字符串只有10个字符,则实际存储的字符串为10个字符和一个字符串结束字符。VARCHAR在值保存和检索时尾部的空格仍保留。

3.掌握如何选择数据类型

待续..

4.熟悉常见运算符的概念和区别

待续..

5.掌握总和案例中运算符的运用方法

待续..

6.课后习题及答案

待续..

7.温故而知新

待续..

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值