**前言:**本节内容讲述MySQL的数据类型, 我们在学习之前的建表的时候已经用过各种各样的数据类型。 比如int、varchar、char类型等等。其中它们是对表的结构的操作, 并没有对数据的内容进行操作,所以它叫做DDL。另外,还有许多其他的数据类型以及其中的细节我们并不清楚。 本节就是具体的对于MySQL中的数据类型进行一些列讲解。 ** ps:本节内容建议学习了建库和建表的友友们进行观看。 **
数值类型
数值类型主要有**tinyint(1字节)**、**smallint(2字节)**、**mediumint(3字节)**、**int(4字节)**、**bigint(8字节)**等,这么多类型都叫做整数类型。其中如果**不加unsigned默认为带符号的整形,, 带上unsigned叫做不带符号的整形类型**。
tinyint
我们先在创建一个表, 这个表里面只有一个tinyint类型:
然后我们对立面进行插入:
我们插入之后就会发现,当我们插入-128可以, 插入-127也可以, 插入127也可以。 但是插入128就不行了, 插入-129就不行了。 并且报错说了超出范围。
然后创建一个无符号的tinyint类型, 然后我们再插入负数就不行了。 并且整数我们可以插入到了255。 负数和256以上都差入不了。
** 也就是说, 这个和我们的语言是不一样的。语言如果插入的太大, 语言就会帮助我们进行截断。但是mysql不能截断,该插入多少就是多少, 超过了这个范围就插入失败!!反过来, 如果我们已经有数据插入到了mysql中, 那么这个数据就一定是合法的。 所以,mysql中, 一般而言, 数据类型本身也是一种约束!!!就能保证数据库中的数据是可预期、合法的。**
** ps:smallint 、midumint、int类型和tinyint类似, 这里不做演示。**
bit类型
bit类型,为类型。 使用的时候就是bit(M)。M指定位数, 默认为1, 范围是1 ~ 6。
![](https://i-blog.csdnimg.cn/direct/929ca4000477445da0a2ef252d507b37.png)
我们创建一个bit类型, 大小为1,那么我们插入的时候, 特定字段就不能插入超过2。
浮点类型
float
float类型如何使用呢?
float[(m, d)]:这里面的m指定的是显示的长度, d指定的是小数的位数。整个float占用4个字节。
下面我们创建一个float类型的表, 来进行插入示范一下:
上面我们是创建一个4个位数, 然后小数点后面指定必须是2位。 然后也就是说整数部分一定只能是2位。
** 然后, 我们一开始就是正常插入99.99, 显然可以插入; float是有符号的,所以我们插入-99.99的时候也可以插入;如果我们的整数部分插入的时候不是两位而是大于两位, 999.99, 那么就不能插入, 因为规定了整数部分必须是两位。 即便是999.9也不可以, 因为整数部分必须是两位; 当小数部分插入的时候不是两位, 如果是小于两位就补零。 相当于插入99.9其实插入的是99.90;如果小数部分插入的时候大于两位, 那么就进行四舍五入, 比如99.994234324324, 那么对第二位的后一位进行四舍五入为99.99。 但是如果是99.995, 四舍五入为100.00所以就不行了。**
** ps: 那么对于有符号的float(4, 2)类型, 范围是(-99.99 ~ 99.99) 。 无符号是(0 ~ 99.99) ,这里不做讲解,自行验证。**
现在我们使用一下float的默认的存储范围:
我们会发现,我们插入了一个很大的数字, 但是他只给我们存储了整数的部分, 并且整数的部分也不准, 也有精度损失。 所以我们就能观察到, 其实**float是有精度损失的。 **
decimal
decimal也是浮点类型。 float如果存储的数字很大就不准了, 但是decimal不会。 decimal的用法和float类似, 也是decimal[m, d]:m指定长度, d指定小数部分的位数。
我们下面进行两者的对比:
我们的float和decimal都是用了(10, 8), 也就是两个整数位, 8个小数位。 然后插入相同的数据我们会发现两者的插入结果不一样。 其中**float的类型插入的数据精度丢失, 而decimal的精度没有丢失。 **
字符串类型
char
char是固定长度字符串, L是可以存储的长度,单位为字符, 最大的长度可以为255。
我们创建的char(2), 意思就是创建的两个字符的类型。 然后我们插入一个'a', 可以插入; 插入'ab'可以插入; 插入'abc', 不可以插入了。 说明一个字符就是占用一个位。 char(2)就可以插入两个字符。 但是我们如果插入一个汉字”中', 可以插入, 为什么插入'中国'也可以插入呢?我们知道, 一个汉字在utf8中是3个字节。 所以,我们就可以推断, **在mysql中的一个字符, 不同于语言一个字符就是一个字节。 mysql的一个字符就是一个字符, 一个汉字也是一个字符!!**
varchar
varchar是边长字符串。 他的最大长度是65535, 比char要大。
由上面的例子我们就可以看到, varchar类似于char, 也是一个汉字就是一个字符。 括号里是多少, 就是创建多少字符的类型。
现在,我们看一下下面这个:
我们创建一个65535大小的varchar类型,就会报错说类型太大了。 但是我们上面不是说varchar的类型最大时65535吗? 这里的65535是说的字节, 而不是字符个数。而字符数就是他说的这个16383。
** 另外 , 关于varchar(len), 这个len到底是多大, 和表的编码是相关的。 根据一个字符占多少来进行计算出来的。 比如utf8就是65535 / 3 = 21845, gb就是65535 / 2 = 32767. 在mysql8.0里面是utf8mb4, 和上面有不一样。 并且, 如果是char, 我们要len个字符, 就是给我们6个字符的空间。 但是对于varchar, 我们虽然要了len个字符, 但是如果实际中我们只是用了1个字符, 那么varchar就只会给我们1个字符的空间, 这个len对于varchar只是一个上限。**
还有, varchar中其实有1 ~ 3个字节用于记录数据大小, 所以我们实际上varchar最大的字节数是65535 - 3。
然后char和varchar的优缺点就很容易看出来:
- ** varchar变长:效率低, 节省空间。**
- ** char定长:效率高, 浪费空间。**
日期和事件类型
date:日期,'yyyy-mm-dd'占3个字节。
datetime:日期和时间,'yyyy-mm-dd HH:ii:ss' 占8个字节。
timestamp:时间戳, 从1970年开始进行计算, 占用4个字节。
enum和set
enum
enum是枚举类型, 枚举类型是我们只能在枚举出来的选项中选择一个。 是多选一:
我们如果创建一个gender枚举男和女。 我们插入的时候如果插入男, 可以插入; 如果插入女, 也可以。 但是如果插入别的, 就不行了。
但是, 我们可以插入1和2:
这是因为在枚举中, 枚举变量的下标是从1开始的, 然后以此类推。 我们进行插入时, 也可以利用下标来代指枚举变量。
set
还是我们上面的t12这个表:
在插入的过程中, 我们有可能遇到这种情况, 就是我们一个人, 比如说赵六, 他既喜欢游泳, 又喜欢写代码。 那么怎么办呢? 这个就要用到集合:
所以, 我们插入集合的方法就是一个' ', 中间可以写集合里面的元素,中间用逗号分割。
另外, 我们如果想要让数字表示集合的元素。 规则和枚举不一样。 这里使用的是二进制来表示对应位置的元素有没有进行插入。 就比如我们上面创建的表, 我们的表的集合里面一共有四个元素。 如果**全部插入就是1111(二进制); 如果是不插入游泳就是111; 如果插入不插入乒乓球, 就是1101; 如果不插入代码, 不插入羽毛球, 插入乒乓球和游泳就是1100。**现在来测试:
如何查找
查找enum比较简单, 执行select where语句即可:![](https://i-blog.csdnimg.cn/direct/8933c364199b4c30beb358dedaf49605.png)
查找set, 假如我们想要查找只喜欢羽毛球的人容易查找, 直接select where:
但是如果我们想要的是喜欢羽毛球的人, 这些人也肯能喜欢乒乓球, 可能喜欢游泳啥的。 这个时候它们就不能被选到。所以这里就要用到一个函数**find_in_set**。 select 是可以执行函数的。 这个**find_in_set**的作用就是查找集合里面的某一个元素, 并且返回这个元素的下标。 如果返回0, 那么没有查找到:![](https://i-blog.csdnimg.cn/direct/d80e04ab970a4b10b087d7c70177e834.png)
——————以上就是本节全部内容哦, 如果对友友们有帮助的话可以关注博主, 方便学习更多知识哦!!!
版权归原作者 打鱼又晒网 所有, 如有侵权,请联系我们删除。