目录
前言:
数据类型:
整数型:
浮点数与定点数:
浮点数:
定点数:
日期与时间:
DATATIME:
DATE:
TIMESTAMP:
编辑 YEAR:
TIME:
前言:
前面的几篇写了如何创建数据库、创建数据表、如何更改表中的字段、如何进行主键约束、唯一约束、外键约束等等。本篇就要说一下数据表里面的”数据“。
首先说说数据类型。
数据类型:
无非是四大类:整数型、浮点数、日期时间、字符串。
本文先介绍前三个。
在前面的博文中,出现了INT(11) 和 FLOAT 两种数据类型。看到这里,有个问题想问很久了:括号里面的11,指的是什么?
该数字指的是数值的数字个数。如 123,个数是3.
那我们先来看整数型。
整数型:
首先,回答问题: tiny,small 谁最小?
tiny
因此 TINYINT 也是最小的,其次是 SMALLINT < MEDIUMINT < INT < BIGINT。
整数类型 | 储存字节 | 无符号取值范围 | 有符号取值范围 |
TINYINT | 1 | 0~255 | -128 ~ 127 |
SMALLINT | 2 | 0~65535 | -32768 ~ 32767 |
MEDIUMINT | 3 | 0~16777215 | -8388608 ~ 8388607 |
INT | 4 | 0~4294967295 | -2147483648 ~ 2147483647 |
BIGINT | 8 | 超大 | 超大too |
# 注意,括号内是数据长度,数据长度和取值范围没有关系,并不相互限制!
尝试创建一个数据表,对比一下子这五款数据类型:
# 表的字段不能用 in,会报错。
浮点数与定点数:
浮点数:
浮点数分为单精度浮点数(FLOAT)和双精度浮点数(DOUBLE),如果不太清楚这个概念的话请点击下方大佬链接进行查看:
单精度和双精度的区别_LonelyMrFan的博客-CSDN博客
(这些数据的取值范围太大了,痛苦的闭上了眼睛,就不一一往里敲了,允许我懒惰一下。)
# 如果用户指定的精度超过了精度范围,就会四舍五入处理。
# 插一句:其实在python中使用浮点数的时候,敲进去倒是无所谓,一旦进行运算,就会发现精度问题很大,这里也是一样的,所以要尽量避免用浮点数进行运算。
定点数:
DECIMAL (M,D)
定点数以字符串的形式储存,这样的话其精度就相对较高。
其实说到这里还是晕乎乎的,那么我们直接上例子:
首先选择一个数据库,创建一个名为 flot 的数据表,提示语句如下:
CREATE TABLE flot
(f FLOAT(5,2), d DOUBLE(6,2), dc DECIMAL(5,2));
括号内的数字分别表示(总共数字数,小数点后数字数)
成功后查看一下数据表:
好的,这个数据表已经创建完成了,那么我们往里添加数据。
INSERT INTO <表名> VALUES(数据);
如果想要查看表中的数据,就不能使用 DESC 语句了,应该改为 SELECT * FROM <表名>;
可以看到,我们输入的浮点数原封不动的保留了下来,即保留了两位小数。
那么再来尝试一下输入带有三位小数的数字。
结果如下:
对比前后两个,我们可以发现,浮点数和定点数都进行了四舍五入的操作。后面只保留两位小数,也就是说,我们在建表的时候,字段 FLOAT 后面的【字段属性】 (f FLOAT(5,2), d DOUBLE(6,2), dc DECIMAL(5,2));,第二个数字“2”,表示的是“保留几位小数”。
这里有一个warning,我们使用: SHOW WARNINGS; 进行查看
就是告诉你:输入的浮点数,如果小数点后面的数字数超过了规定数量,会自动四舍五入;定点数也会自动四舍五入,但是他会返回一个WARNING 告诉你。
接下来验证【字段属性】中第一个数字是干嘛用的:
(f FLOAT(5,2), d DOUBLE(6,2), dc DECIMAL(5,2));
随意插入几个比较大的浮点数:
(这里建议各位可以自己操作下,比干看我的错误强)
经过一堆错误之后,发现最后一个对了,那么我们查看下表内数据:
我们可以发现:
1. 规定小数后有2位,如果不满2位,用0补齐,超过两位,四舍五入。
2. 建立数据表字段属性的时候,括号内第一个(就是前面标红的数字) 指的是数据中包含的数字个数。
日期与时间:
DATETIME:YYYY-MM-DD HH:MM:SS
DATE: YYYY-MM-DD
TIMESTAMP: YYYY-MM-DD HH:MM:SS
YEAR: YYYY
TIME: HH:MM:SS
为了方便操作,我建立了一个数据表:
DATATIME:
该类型包括 “年 月 日 时 分 秒”,以字符串形式输入,需要8个字节储存。
如:生成 2012-5-6 06: 30: 10 这一个时间,
可以输入:“2012-5-6 06: 30: 10” 或 “20120506063010”.
# 注意取值范围不要太过,年最小为1000,最大为 9999。
创建语句如下,创建后进行检查:
也可以输入:“12-5-6 06: 30: 10”或 “120506063010”.
# 这里我只输入了年份的后半部分,不过这里需要注意取值范围:“00~69” --> “2000~2069”;“70~99” --> “1970~1999”
尝试输入“981203193010”:
使用 NOW() 插入当前日期和时间。
如果使用 CURRENT_DATE() 则会只显示“年月日”,不显示时间。
DATE:
YYYY-MM-DD: 需要3个字节进行储存。
这一部分的格式可以参考 DATETIME 的“年月日”部分,完全相同。(这一部分不再进行实践)
使用 CURRENT_DATE() 或 NOW() 插入当前日期。
依然利用上面创建的数据表,添加字段 d ,数据类型为 DATE:
查看后,确定添加完成。
向表内插入数据,如果不想插入“DATETIME”类型数据,可以用 NULL 来占位。
尝试插入当前时间:
TIMESTAMP:
TIMESTAMP 的显示格式和 DATETIME 相同,储存需要4字节,但DATESTAMP 的范围明显小于 DATETIME。其范围为:'1970-01-01 00:00:01' UTC ~ '2038-01-19 03:14:07' UTC
# UTC = Coordinated Universal Time 标准时区
和DATETIME不同的是,TIMESTAMP 是先将输入的时间转化为标准时区的时间,并以标准时区格式进行保存,查询时再进行转换。
这个语句可以修改时区:
set time_zone='+<小时数>';
YEAR:
范围: 1901~2155
在添加“年”的时候,可以使用字符串,也可以使用数字。字符串和前面的内容一样,数字则需要注意“0”和“00”。
添加字段:
先添加 数字00 试试看。
添加数字 0 试试:
添加字符串 “00”:
这回就变成了 2000,再试试单个字符“0”:
依然是可行的。
再试试其他数字,如 1978;
是可以的。
TIME:
取值范围:-838:59:59 ~ 838:59:59
TIME 类型不但可以表示一天的时间,还可表示过去的时间,和时间段。
插入时间的时候也有不同类型:
1122:指的是 00:11:22
前面的数据太多,清空一下:
好的,我们来重复前面的步骤,添加字段,插入数据:
11: 22: 00
差别显而易见。
如何表示“一段时间”呢?
D HH 格式:
比如我想输出:2天零3个小时
’2 03‘
2天3小时27分51秒:
# 时间部分也可以什么符号都不带,直接敲一串数字:031729——3小时17分钟29秒,但要注意,分钟部分不能够超过60,否则就会报错。
# 如果想要输出当前的时间,NOW() 最方便,还可以尝试 CURRENT_TIME()
注意:
MySQL允许不规则语法出现,可以用各种符号代替 “-” 和 “:”,不建议这么干,太乱。