MySQL数据类型

目录

一.数据类型

1.分类 

2.数值类型

二.整数类型

1.tinyint类型

2.bit类型

三.小数类型

1.float

2.decimal

四.取整方式

1.零向取整

2.向上取整

3.向下取整

4.四舍五入

五.字符串类型

1.char

2.varchar

六.日期和时间类型

七.enum和set类型


        前言:这一篇介绍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的用处很多,还可以当作计算器用:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰果滴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值