今天呢,主要和大家讲数据库数据类型,数据类型本身也是一种约束,这就好比我们玩游戏制定规则一样,必须要执行。对于数据库学习呢,同时大量练习是必不可少的,在大厂面试中数据库也是问得比较多的一块知识。大厂实习,一起冲冲冲~
目录
数据类型分类
数据库为什么要有数据类型呢?
1、数据也是一种约束
2、决定开辟空间的大小
数据库约束,只能插入对应数据类型特定的范围值!!数据本身就是一种约束,MySQL是直接和数据打交道,所以要遵守MySQL的规则。
数值类型
tinyint
我们从上面实验可以看出来,如果插入数据超过tinyint规定的范围,那么就插入失败了。
tinyint unsigned
bit
这里bit(M),M表示比特位的位数(二进制),至于数据上限多大,根据二进制位数算出来的值即可。
int
小数类型
float
float unsigned
decimal
float和decimal之间的区别
flaot和decimal使用上没什么区别,但是他们之间精度是有区别的。
我们举个栗子:
所以,如果我们想要存储小数位精度比较高的数字,可以考虑使用decimal。
字符串类型
char
我们使用char(L) 时,L表示字符个数,在这里,一个汉字、数字、字母都代表一个字符。
不要认为字符等价于字节。
varchar
varchar(L)中L表示字符个数,L的大小其实和具体编码有关。
说明
char和varchar的比较
如何选择定长或变长字符串?
1、如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
2、如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
定长变长字符串特点
1、定长的磁盘空间比较浪费,但是效率高。
2、变长的磁盘空间比较节省,但是效率低。
3、定长的意义是,直接开辟好对应的空间4、变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。
日期和时间类型
date:日期 'yyyy-mm-dd' ,占用三字节
datetime: 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节
举个栗子:
更新数据update ... set ...
enum
enum:枚举,“单选”类型;
enum('选项1','选项2','选项3',...);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。
举个栗子:
对于enum多个选择中只能选择一个,但是现实中存在多选的情况,显然只有enum是不行的,所以还需要有别的数据类型来支持:set。
set
set:集合,“多选”类型;
set('选项值1','选项值2','选项值3', ...);
该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,.... 最多64个。
举个栗子:
注意:set在进行多选时,逗号后面不要加空格,否则就不对了。(上面例子有演示)
当我们用数字插入时:
虽说enum和set都支持数字插入,但是实际上我们不建议使用,因为这样的SQL语句代码可读性不高。
集合查询使用find_ in_ set函数
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0; str_list 用逗号分隔的字符串。
为什么要有find_in_set函数?对于下面的场景:
假如我们查找的是所有人爱好中有游泳的人的信息,但是使用wher语句确实一种精确查找,只查找到了喜欢游泳的人信息。所以这显然是不符合我们的预期的。
所以要有fd_in_set函数来帮助我们查找集合关系的信息内容:
总结
数据类型本身就是一种约束:倒逼程序员规范操作数据!!
数据类型本身也是一种约束:给数据表中数据,提供极大的确定性!!
一旦你不满足我的条件,我直接终止你。