目录
前言:这一篇介绍MySQL的数据类型,学过语言的数据类型后,再学这个就比较简单了,这里会详细的举例子说明该数据类型的限制条件和作用方式。
一.数据类型
1.分类
2.数值类型
二.整数类型
1.tinyint类型
使用该类型创建一个表t1:
下面进行测试:
这里可以发现如果越过tinyint的类型,就会直接报错,终止操作,在范围内的就可以正常插入进去。
在mysql这里,如果插入的数据不符合要求,mysql直接终止操作。
数据类型这,符合条件,让你操作,不符合条件,不让你操作。使得程序员必须遵守规则(约束程序员)。
数据类型在mysql这里,除了能够满足各种应用场景,还有一个特别重要的用途:数据类型本质就是一种 约束。
在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。
可以通过unsigned来说明某个字段是无符号的:
创建一个tinyint unsigned类型的表t2:
测试:
在0-255范围内的可以,超过就直接终止。
2.bit类型
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1
创建bit类型的表t3:
测试:
这里我们插入10, 10,会发现bit类型的10很奇怪,这是因为bit类型会按ASCII码对应的值显示。这里10是不可显字符,所以会这样。
插入256,就越范围了,直接终止。
这里插入字符a,这时就可以看到显示的就是a
255也是可以被插入的,也是按照ASCII码显示的
如果,我们只存放0或1,这时可以定义bit(1)来节省空间。虽然0和1按ASCII是不可显字符,但是读取时是可以读出来的。
三.小数类型
1.float
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。
创建float类型的表t4:
测试:
99.99和-99.99符合条件,正常可以插入。
这几个超过了最大位数4(整数最大2位,小数最大2位【有时可以3位】),因此不能插入(不过有的5位数是可以插入的)。
小于最大位数可以插入。
这里会发现,99.990、99.991、99.992、99.993、99.994都可以插入,而99.995无法插入。这里我们应该会想到什么,没错,就是四舍五入,这里四舍可以写,但是没有用。
这里后面插入的 99.990、99.991、99.992、99.993、99.994,显示的都是99.99,因为最大显示4位数,最后一位小于等于4就会舍去。
unsigned的float的范围就变成了0 ~ 99.99,负数部分直接被砍掉:
这里把原来表内的数据全部删除,并把salary的float(4,2)类型修改为float(4,2) unsigned。
满足条件,正常插入。
有一点负数就无法插入。
-0这种是可以插入的。
超出范围,无法插入。
2.decimal
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
decimal(4,2) 表示的范围是 -99.99 ~ 99.99
decimal(4,2) unsigned 表示的范围 0 ~ 99.99
decimal和float很像,但是有区别:
float和decimal表示的精度不一样:
对float和decimal同时插入相同的数:
这里会发现插入后显示的数是不一样的。
float表示的精度大约是7位。
decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10。
如果希望小数的精度高,推荐使用decimal。
四.取整方式
1.零向取整
2.6、2.1这样的正小数取整后变为2,-2.1、-2.6这样的负小数取整后变为-2,即正数和负数都向着0方向取整,就叫零向取整。
语言级别上都是零向取整,比如C语言中, 10 / 3 = 3, -10 / 3 = -3。
2.向上取整
2.6、2.1这样的正小数取整后变为3,-2.1、-2.6这样的负小数取整后变为-2,正小数向上取整,负小数直接丢弃,即正数和负数都向上方向取整,就叫向上取整。
3.向下取整
与向上取整正好相反。
2.6、2.1这样的正小数取整后变为2,-2.1、-2.6这样的负小数取整后变为-3,正小数直接丢弃,负小数向下取整,即正数和负数都向下方向取整,就叫向下取整。
4.四舍五入
就是我们所熟知的四舍五入。
五.字符串类型
1.char
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
注意:这个L是一个字符,不是一个字节。一个字符既可以是一个字母,也可以是一个汉字。
创建char类型的表t6:
测试:
a和ab可以插入,abc超过2无法插入。
空格也是字符,也可以插入。
中文字符<=2,也可以插入。
如果想要设置256大小,则会直接终止,下面写着max = 255,因此最大为255。
2.varchar
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
注意:这里最大长度是字节,不是字符。但是L是字符,因此实际L的最大长度并不是65535,这个在下面会进行测试。
创建varchar类型的表t8:
测试:
超过6个字符无法插入。
中文也是如此。
这里我们会发现varchar的可变长字符串与char的固定长度字符串,感觉上没有差别。但是实际上是有差别的
并且一个字符串长度有上限和它是变长的并不直接冲突。
关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:
varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。
当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844(因为utf中,一个字符占用3个字节),如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。
这里创建字符大小为21844,可以创建成功。
但是大小改为21845就失败了。
char和varchar比较:
varchar可以更加合理的利用空间。
如何选择定长还是变成字符串:
① 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
② 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
③ 定长的磁盘空间比较浪费,但是效率高。
④ 变长的磁盘空间比较节省,但是效率低。
⑤ 定长的意义是,直接开辟好对应的空间
⑥ 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少
如果不确定变长还是定长,可以根据更注重效率还是空间,要效率就选择定长,要空间就选择变长。
六.日期和时间类型
常用的日期有如下三个:
date :日期 'yyyy-mm-dd' ,占用三字节
datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节
创建表t11:
测试:
这里要注意(t1, t2)这个是不能省略的,因为timestamp时间戳是不需要手动设置的,因此我们能设置的只有前两个t1, t2,为了只设置这两个,就需要写(t1, t2)。
timestamp是根据我们操作的时间自动生成的。
这里修改t1,就会发现t3时间戳也更者变化了。 新增或修改时,timestamp会自动生成或修改。
七.enum和set类型
enum:枚举,“单选”类型;
enum('选项1','选项2','选项3',...);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....最多65535个;当我们添加枚举值时,也可以添加对应的数字编号:
set:集合,“多选”类型;
set('选项值1','选项值2','选项值3', ...);
该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,....最多64个。
创建表:
测试:
enum只能选择其中一个,set可以选择多个。这里符合要求,正常插入
这里enum选择了2个,不符合报错,选择其它也不符合报错。
这里选择0,有的mysql是会直接报错的,这里相当于没有选择。
选择1或者2就相当于enum中的第一个或者第二个,即男或女,这是等价的。
这里set以数字的形式插入,是按照位图的方式。上面创的表中有6个hobby,因此每一个爱好对应一个bit位,000001就对应敲代码。所以最大6个1应该是63,下面测试一下:
63就拥有全部的爱好。
超过63就直接报错,0则是什么都没有。
查找某个enum的值:
查找成功。
查找某个set的值:
这里查找hobby为敲代码的人,会发现只会查找到只有hobby是敲代码的人,其他包含敲代码这个爱好的人无法查找。
如果想要查找所有包括这个hobby的人,就要用到find_in_set函数了:
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0;str_list 用逗号分隔的字符串。
测试:
用find_in_set就成功查找包含敲代码这个爱好的人了。
select的用处很多,还可以当作计算器用: