✨✨hello,愿意点进来的小伙伴们,你们好呐!
系列专栏:【MySQL初阶】
本篇内容:从0到1详解MySQL数据类型
作者简介:一名现大二的三非编程小白,日复一日,仍需努力。
MySQL中在我们创建表的时候都会指定该创建的表的列的数据类型。然后在MySQL中有很多的数据类型,也称为列类型,跟Java语言相比,MySQL的数据类型就实在多太多了。这些数据类型都有不同于其他数据类型的一面。接下来让我来讲解一下这些数据类型其背后的细节。
看到该图中的这么多的数据类型是否会已经看呆了,真的是很多很多,那么在我们平时使用数据库时,数据类型的使用规范是:在可以满足需求的情况下,尽量选择占用空间较小的数据类型。当然也会分为常用的数据类型与非常用的数据类型。,接下来让我来讲解一下常用与一些特殊的数据类型。
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] 类型是一个字节大小,有分无符号与有符号两种类型。
接下来让我们来深入体会它的范围与有无符号的差别
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】类型中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是一种字符串固定长度的类型,最大字符串的长度为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中指定的是该类型的值所可以存储的最大字符数,但是在每一次存储的时候,最终实际上开辟的存储空间都会取决于存进去的字符串的长度,如果存进去的字符串长度小于size,那么就会开辟字符串长度的空间来存储。但是如果大于的话,就无法存储进去。
然后VARCHAR的范围为字节【0 ~ 65535】,注意!!!
范围的是字节数,并不是字符数,字符数的范围需要我们根据不同的编码来进行计算,接下来让我来计算一下。
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个字节数来存储大小
1.两种类型存放的数据的大小都是以字符计算的,并不是字节
2.如果对于数据是定长的,那么推荐使用char,比如说身份证,手机号码。
3.但是对于一个字段不是定长的那么我们就要使用VARCHAR比较合适,比如是文章。
4.对于更长的字符串我们可以使用text来存储,text也是可变字符串。