MySQL: 数据类型之整数型、浮点数、时间日期

文章详细介绍了MySQL中的数据类型,包括整数型(TINYINT到BIGINT)、浮点数(FLOAT和DOUBLE)、定点数(DECIMAL)以及日期和时间类型(DATETIME,DATE,TIMESTAMP,YEAR,TIME)。讨论了各类型的特点、存储范围以及使用示例,特别强调了数据长度和精度的影响,并提供了创建表和插入数据的实际操作示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言:

数据类型:

整数型:

浮点数与定点数:

浮点数:

定点数:

日期与时间:

DATATIME:

 DATE:

TIMESTAMP:

​编辑 YEAR: 

TIME:

字符串类型之文本字符串:

CHAR(M):

VARCHAR(M):

TEXT:

ENUM:

SET:


前言:

前面的几篇写了如何创建数据库、创建数据表、如何更改表中的字段、如何进行主键约束、唯一约束、外键约束等等。本篇就要说一下数据表里面的”数据“。

首先说说数据类型。

数据类型:

无非是四大类:整数型、浮点数、日期时间字符串

在前面的博文中,出现了INT(11) 和 FLOAT 两种数据类型。看到这里,有个问题想问很久了:括号里面的11,指的是什么?

该数字指的是数值的数字个数。如 123,个数是3.

那我们先来看整数型。

整数型:

首先,回答问题: tiny,small 谁最小?

tiny

因此 TINYINT 也是最小的,其次是 SMALLINT  <  MEDIUMINT  <  INT <  BIGINT。

整数类型储存字节无符号取值范围有符号取值范围
TINYINT10~255-128 ~ 127
SMALLINT20~65535-32768 ~ 32767
MEDIUMINT30~16777215-8388608 ~ 8388607
INT40~4294967295-2147483648 ~ 2147483647
BIGINT8超大超大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允许不规则语法出现,可以用各种符号代替 “-” 和 “:”,不建议这么干,太乱。

字符串类型之文本字符串:

MySQL支持两类字符串:文本字符串和二进制字符串,这里先说文本字符串。

CHAR,   VARCHAR,   TINYTEXT,   TEXT,   MEDIUMTEXT,   LONGTEXT,   ENUM,   SET

CHAR(M):

固定长度为M,1<= M <= 255

固定长度的意思为:如果输入的是空,则用空格进行占位。

首先创建一个名为 str 的数据表,并加上字段:c CHAR(4)。

(以往我们在数据表中输入数据,如果数据为空,直接输入 NULL 进行占位,如果不输入,则会报错。如果字段的数据类型是 CHAR, 则可以输入 NULL ,输出结果为“NULL”,但如果只输入一个空字符串,也不会报错,查看的时候会返回一个空的字符串。)

测试如下:

 # 上面的 vc 是我在数据表中插入的另一个字段 vc VARCHAR(4)

VARCHAR(M):

这个数据类型很常见了。 

非固定长度L=M+1,L <= M,  1 <= M <= 255;

其实上面也已经给出了其相关用法,我们插入一个空字符串:

 # 这里就不对该类型做过多解释了,如果输入的字符串长度超过了字段属性中的限制数量,那么就会“自行截断”。

TEXT:

 主要用来保存文章内容啦,评论啦等等,而他旗下的小弟们,如:TINYTEXT,   TEXT,   MEDIUMTEXT,   LONGTEXT,最大的区别就是储存长度和储存空间不同。

ENUM:

其实就是enumerate 的意思。

我将其理解为 “盖章”。举个例子,每个分数都有其对应的评级:优,良,中,差;类似于标签。

# ENUM和“自动增加约束”不一样,ENUM 需要手动添加。

# 应该可以实现自动添加,就是我还没有弄清楚。

# ENUM 内部值可以用其名称(但要保持字符串结构),也可以用内部值的‘索引’(从1开始)

重新建立一个名为 str 的数据表:

# 从 EXCELLENT 到 BAD 的‘索引’ 为:1, 2, 3,4

# 注意每个字段都应该有字段名,不要忘记

插入数据:

 

不难发现,前三个数据 和 后三个数据是一样的。

查看结果:

 

SET:

 SET 是字符串对象,里面最多可以放64个成员,使用逗号间隔,为创立数据表规定的值。

# 自动删除尾部空格

# 自动剔除重复值

# 自动按顺序排列

尝试插入SET:(该数据表依然是重新创立的)

 会发现报错了,为什么?

没添加值呀!

# 注意,SET 内部添加的是字符串,整数INT放进去也要加‘’

# SET 中放入的是单个字符,插入的值也应该是单个字符

 # 自动排序

 # 删除重复内容

关于二进制字符串类型,最近会添加在本文中。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值