1. 数据类型分类
2. 数值类型
MySQL中的数值类型与C/C++中的很相似,并且也有unsigned类型
2.1 tinyint
该类型的值的取值范围为[-128, 127], 无符号的范围为[0, 255]。
从下图可以看到,符合规定的数据将被添加到表中
当我们在向MySQL表中特定的类型中插入不合法的数据时,MySQL一般都是直接拦截的,不让我们做对应的插入。 --- 数据类型也是一种约束。
- 整型可以指定是有符号和无符号的,默认是有符号的
- 通过unsigned来说明某个字段是无符号的
其他的整型类型可以自己试一下,与tinyint是类似的
2.2 bit类型
基本语法:
bit [(M)] : 位字段类型,M表示每个值的位数,范围: 1-64。[]中的内容是可以省略的, 则默认M为1。
上图中,我们创建了一个表t2,明明在online字段插入了0、1,为什么没有显示呢?
bit的使用事项:
- 比特字段在显示时,是按照ASCII码对应的值显示的
- 当我们在只存放0/1这样的数值时,可以定义bit(1),从而节省空间
- 可以使用 select id, hex(online) from t2; 来显示bit类型的值。
hex(online)
: 这个函数将online
列的二进制数据转换为其十六进制字符串表示形式 - 若在创建表时,将bit的值设置超出界限,会报错:
2.3 小数类型
2.3.1 float
基本语法:
float[(m, d)] [unsigned] : MM指定的显示长度,d指定的小数位数,占用空间4个字节
如上图所示,创建了一个表,包含小数类型的字段score,宽度:4,小数位数:2;由上图可以知道,该字段范围为[-99.99, 99.99],当插入数据不够两位小数时会补0;当插入数据小数超过两位时,四舍五入(且要保证四舍五入后的数据要合法,否则报错)。
假设定义的为 float(4, 2) unsigned 时,其范围为[0, 99.99];
注:double与float相似,可以自己尝试,但是double的精度要高得多。
2.3.2 decimal
基本语法:
decimal(m, d) [unsigned0 : m指定长度,d表示小数点的位数
- decimal(5, 2) 表示的范围是 -999.99~999.99
- decimal(5, 2) unsigned 表示的范围为:0~999.99
- decimal与float很像,但是表示的精度不同。
由上图可以看出,虽然float指出宽度为20,小数点位数为10,但是存储到的float数值精度大约是7位,而decimal的精度就高的多了。
- float表示的精度大约是7位
- decimal整数最大位数位65,支持的小数最大位数d是30;如果d被省略,默认为0,如果m被省略,默认是10;
- 如果希望小数的精度高,则使用decimal。
3. 字符串类型
3.1 char
基本语法:
char(L):固定长度字符串,L是可以存储的长度,单位为字符(一个符号:字母、数字、汉字、符号...),最大长度值可以是255
3.2 varchar
基本语法:
varchar(L):可变长度字符串,L表示字符长度,最大长度65535个字节 -- 这里要注意是字节
L:为上限,若只用了一个字符们则指分哦欸一个字符的空间
观察上图,我们明明说vachar长度可以指定到0~65535之间,那为什么上面会报错呢?
其实是这样的,L的值与表的编码格式(charset)密切相关
- varchar长度可以指定到0~65535之间,但是有1~3个字节是用于记录数据大小,所以说有效字节数为65532
- 当我们的表的编码为utf8时,varchar(L)的参数L最大值为65532/3=21844(在utf8中,一个字符占3个字节);如果编码是gbk,varchar(L)的参数L的最大值是65532/2=32766(gbk中一个字符占2个字节)。
3.3 char和varchar比较
- 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
- 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
- 定长的磁盘空间比较浪费,但是效率高。
- 变长的磁盘空间比较节省,但是效率低。
- 定长的意义是,直接开辟好对应的空间
- 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少
4. 日期和时间类型
常用的日期有如下三个:
- date:日期'yyyy-mm-dd',占用3字节
- datetime:时间日期格式 'yyyy-mm-dd HH:jj:ss' 表示范围从1000到9999,占用8字节
- timestamp:时间戳,从1970年开始的'yyyy-mm-dd HH:jj:ss'格式和datastamp完全一致,占用4字节,表中包含此字段时无需更改,对相关记录的更改会自动更新这个值
无需对timestamp类型的值进行修改,会自动修改
5. enum和set
基本语法:
enum:枚举,“单选类型”;
enum('选项1', '选项2', '选项3', ...);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而出于效率考虑,这些值实际存储的是数字,因为这些选项的每个选项值依次对应以下数字:1,2,3...... 最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。
set:集合,“多选”类型
该设定只是提供了若干个选项的值,最终一个单元格内,设计可存储了其中任意多个值;而且出于效率,这些值存储的都是”数字",因为这些选项的每个选项依次对应如下数字:1,2,4,8......,最多64个。
在插入时一定要注意字符的大小写,否则会出错。set类型可以一次插选择多个选项。在插入时,我们也可以用数字进行插入数据,如下:
有如下数据,从中查询喜欢游戏的人:
使用如下查询语句:
只能查出只喜欢游戏的人,不能查询出所有,我们可以使用下面的语句:
集合查询使用函数:
find_in_set(sub, str_list):如果sub在str_list中,则返回下标;否则返回0; str_list为使用逗号分割的字符串