mysql中数据类型的作用:
更为重要的是类型约束,即如果操作者不按数据类型进行数据插入时,该条sql数据会被直接拒绝
tinyint类型使用演示
如下:
我们知道,有符号的tinyint的存储范围就是 -128 ~ 127,当我们想插入数据128时,是直接报错的,而不像c/c++ ,会发生截断;
说明:
在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。
可以通过UNSIGNED来说明某个字段是无符号的
而如果想将tinyint 设置为无符号的,只需要在设置列字段时,在类型加上unsigned即可,变成无符号之后,tinyint的存储范围就变成了0 ~ 255;
id tinyint unsigned
基本语法:
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
而我们通过类型表中,是没有我们c++中的bool类型的,而实际上,bit(1)就可以表示mysql中的bool类型,即bit(1) 类型的变量的值不是0就是1;
但mysql中的bit类型神奇之处远不止如此
bit使用案例
我们先创建一个张表,然后插入几个数据
插入数据和查看表中显示:
神奇的事情,我们会发现使用bit()存储的变量是使用acill值的形式显示的,10就是我们的’ \n’
float 使用
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
例:
我们先创建一个工资表出来:
float(4,2) 即表示显示长度为4,小数位数为2为,数值范围 :-99.99 ~ 99.99
而后插入几条数据:
我们会发现mysql保存数据时,对于99.994,99.995这些超出数据范围的数据会先对其进行4舍5入,而后再判断是否合法;
说明:
decimal使用
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
说明:
例:
我们会发现,当插入的数据大于8位小数时,使用float存储是不够精准的
说明:
语法:
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
例子:
我们先创建一张表,类型为char(6)
接着我们插入几个数据进去:
我们印象当中utf8中,一个中文大概是3字节大小,而我们指定的大小不是为6吗
使用length函数(求字符串的字节数)查看一下字符串长度
也就是说,mysql中的一个字符,并不是我们c/c++的字符类型(char),mysql中的字符即可以是中文也可以是英文;所以我们char(6) ,表示的字符长度为6,而是字节大小为6;
语法:
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
而varchar实际使用上也是和char是一样的,但只是存储上细节不一样:
char() 是直接将指定长度的空间开辟出来
而varchar()是使用多少数据空间就开多少空间
例:char(6) ,varchar(6) ,插入数据 “中国”,char存储是使用的6个字符大小的空间(早就开好了),varchar存储是2个字符大小
比喻:char就好像c语言中的静态数组,一开始数组大小就固定了,就开好了固定大小的空间,而varchar就像动态数组,用多少开多少;
例:
创建与上面相同的表结构
查看所插入的数据
date :日期 ‘yyyy-mm-dd’ ,占用三字节
datetime 时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从 1000 到 9999 ,占用八字节
timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节
例子:
创建一个生日表:
插入数据:
insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:1:1');
如下:
我们会发现我们没有插入t3 ,而t3默认是以当前的时间戳更新的;
查看一下具体表结构
下面我们将表数据进行修改一下,再查看一下表:
我们会发现当我们对表数据进行更新时,t3也会更新为最新的修改时间,这实际上是timestamp类型在作怪
说明:
enum类型使用
语法:
enum:枚举,“单选”类型;
enum('选项1','选项2','选项3',...);
例:
再往里面插入数据:
我们会发现,使用数字1也可以表示enum当中的第一个选项;
说明:
set类型使用
set:集合,“多选”类型;
set('选项值1','选项值2','选项值3', ...);
说明:
例:
有一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选),(男,女)[单选]
mysql> create table votes(
-> username varchar(30),
-> hobby set('登山','游泳','篮球','武术'), --注意:使用数字标识每个爱好的时候,想想Linux权限,采用比特位位置来个set中的爱好对应起来
-> gender enum('男','女')); --注意:使用数字标识的时候,就是正常的数组下标
如下:
接下来我们插入俩个数据:
insert into votes values('Juse','登山,篮球',2);
insert into votes values('小王',3,'男');
即实际上set中的数据也是数子存储存储的,3代表1,2俩个爱好的合成;
小结:
如下:
[外链图片转存中…(img-M01iTbhF-1684973250081)]
接下来我们插入俩个数据:
insert into votes values('Juse','登山,篮球',2);
insert into votes values('小王',3,'男');
[外链图片转存中…(img-jlr5afO4-1684973250081)]
即实际上set中的数据也是数子存储存储的,3代表1,2俩个爱好的合成;
小结: