详解MySQL数据类型

✨✨hello,愿意点进来的小伙伴们,你们好呐!
🐻🐻系列专栏:【MySQL初阶】
🐲🐲本篇内容:从0到1详解MySQL数据类型
🐯🐯作者简介:一名现大二的三非编程小白,日复一日,仍需努力。

前言:

MySQL中在我们创建表的时候都会指定该创建的表的列的数据类型。然后在MySQL中有很多的数据类型,也称为列类型,跟Java语言相比,MySQL的数据类型就实在多太多了。这些数据类型都有不同于其他数据类型的一面。接下来让我来讲解一下这些数据类型其背后的细节。

在这里插入图片描述

看到该图中的这么多的数据类型是否会已经看呆了,真的是很多很多,那么在我们平时使用数据库时,数据类型的使用规范是:在可以满足需求的情况下,尽量选择占用空间较小的数据类型。当然也会分为常用的数据类型与非常用的数据类型。,接下来让我来讲解一下常用与一些特殊的数据类型。

整型

BIT(M)【位类型】

BIT类型存储的数据是以二进制的方式存在的,后面指定的M是位数的意思,默认为位数1,范围为【1 ~ 64】

1.先创建一个t1表,在该表中给定id的值,类型为BIT(8)
2.然后往该表中存入数值5。
3.查询表中的数据。
4.我们会发现存入表的5,已经转化为字符串的形式,且5最后以二进制的格式存入。

#演示BIT类型

CREATE TABLE t1(
	id BIT(8));
	
INSERT INTO t1 VALUES (5);

SELECT * FROM t1;

在这里插入图片描述

继续存入一个数字1,也是转为二进制的形式,且为字符串存入表中。

在这里插入图片描述

我们已经找知道了存入数组在表中的形式存在是什么样子的了,那么现在会有一个疑问,当我们想找一个数据时,是通过十进制寻找还是通过二进制寻找呢?接下来我们来探索一番。

通过查询语句查找数字5时,我们会发现我们可以使用十进制来查找表中的数据,然后呈现出来的数据是以二进制的形式呈现给我们的。

在这里插入图片描述

TINYINT[UNSIGNED] 类型

TINYINT[UNSIGNED] 类型是一个字节大小,有分无符号与有符号两种类型。
接下来让我们来深入体会它的范围与有无符号的差别

1.我们先创建一个表,表中的元素数据类型为TINYINT。
2.然后我们往表中存放TINYINT类型的最大值—127。
3.然后查询表中是否存在该元素。

我们会发现顺利地将该元素存入表中。

#演示 TINYINT 类型的范围


CREATE TABLE t2(
	id TINYINT );
	#默认为有符号的类型 【- 128 ~ 127】

INSERT INTO t2 VALUES (127);

SELECT * FROM t2;

在这里插入图片描述

那么当这个时候,我们往表中存入128的数字,比该类型的范围还大,这时候就会报错,无法存入该元素。

在这里插入图片描述

在这里我们就很明显地感受到了数据类型的范围的限制。如果感兴趣的小伙伴也可以用无符号的类型试一下,也会有很明细的感受到数据类型范围限制

整型小结:

1.在整型中,我们存入的值都是不带小数点的整数,再整型中,MySQL一共分为了5种数据类型来存储。
2.有存储后为二进制的BIT类型,有不同字节大小的INT类型,那么我们在选择数据类型的时候,就要注意将要存储进去的数据的大小,尽量不要让数据库的存储空间浪费太大,比如说,你要存储【1~100】的值,那么这时候就一般使用TINYINT类型,当然在我们想要方便的情况下也可以使用INT类型来存储。
3.其余的INT类型我就不一一讲解了,他们差别的只有字节的大小,存储范围的不同。

小数型:

在小数型中主要讲解 DECIMAL【M,D】类型,其余的数据类型都较为简单。

DECIMAL【M,D】类型:

在 DECIMAL【M,D】类型中M,D分别代表的是【数据的所有位数,包括小数点前与小数点后】【小数点后的数据位数】。
当我们没有指定M,D的时候,MySQL中你默认的M为10,D为0

1.我们创建一个表,赋予数据类型
2.往表中存放一个精度很高的数据。
3.查询表中的值

仔细数数,我们会发现在该表中的数据的小数点后的位数会自动补0,补成我们指定的位数。

#演示  DECIMAL【M,D】类型

CREATE TABLE t3(
	id DEC(30,20));
	
INSERT INTO t3 VALUES(5000000.5505);

SELECT * FROM t3;

在这里插入图片描述

**接下来我来创建一个表来看看小数型的三种数据类型的差别。
我们会发现精度的巧妙的差异。 **

#演示  DECIMAL【M,D】类型

CREATE TABLE t4(
	num1 FLOAT,
	num2 DOUBLE,
	num3 DEC(20,10));
	
INSERT INTO t4 VALUES(500.55055555,500.55055555,500.55055555);

SELECT * FROM t4;

在这里插入图片描述

文本类型:

CHAR(size):

char是一种字符串固定长度的类型,最大字符串的长度为255个字符。

1.创建一个表,其中char的字符长度为3.
2.往表中存进一个字符长度为3的字符串。
3.查看表。
的确有往表中存放数据

#演示 char 类型

CREATE TABLE t5(
	id CHAR (3));
	
INSERT INTO t5 VALUES ('123');

SELECT * FROM t5;

在这里插入图片描述

然后当我们往表中存放一个字符长度大于3的数据后就会报错。无法存储。

在这里插入图片描述

CHAR类型是一种固定长度的字符串,我们在创建表的时候要指定长度的大小,然后指定创建后,每一次的表的数据大小都是如此。这样子可能会造成空间浪费。
> 比如说:我们创建的时候指定字符串字符长度为50,都是我们存进的字符串长度为5,但是这时候表中的存储只能用50大小的空间来存储5大小的字符串,会造成大量空间浪费。

那这样子的话就不是很合理,在MySQL中也有不会造成空间浪费的数据类型

VARCHAR(size)

VARCHAR是一种可变长度的字符串类型,在size中指定的是该类型的值所可以存储的最大字符数,但是在每一次存储的时候,最终实际上开辟的存储空间都会取决于存进去的字符串的长度,如果存进去的字符串长度小于size,那么就会开辟字符串长度的空间来存储。但是如果大于的话,就无法存储进去。

然后VARCHAR的范围为字节【0 ~ 65535】,注意!!!
范围的是字节数,并不是字符数,字符数的范围需要我们根据不同的编码来进行计算,接下来让我来计算一下。

utf8 字符数计算:

VARCHAR的字节范围为【0~65535】,其实MySQL会预留三个字节来存储字符的长度,那么剩余的可以存储字符的就只有 【65535 - 3 = 65532 】 65532个字节了。那么对于utf8编码来说,它存储字符的字节数为3,那么对于utf8码来说,VARCHAR类型可以存储的字符数为 【65532 / 3 = 21844】 21844个。

接下来我在MySQL中演示一遍:

1.我们会发现无法创建字节数为65535的VARCHAR类型的表数据。然后你继续往下推导,会发现65534,65533都无法创建,只能创建65532字节大小的表数据。这就与我刚刚的解释对应上了。在MySQL中会给该类型的数据预留3个字节数来存储大小

在这里插入图片描述

在这里插入图片描述

VARCHAR 与 CHAR 的细节:

1.两种类型存放的数据的大小都是以字符计算的,并不是字节
2.如果对于数据是定长的,那么推荐使用char,比如说身份证,手机号码。
3.但是对于一个字段不是定长的那么我们就要使用VARCHAR比较合适,比如是文章。
4.对于更长的字符串我们可以使用text来存储,text也是可变字符串。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无满*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值