今天抽时间来讲一下mysql里的知识点,之前有不少人问过我,mysql中的int(11),这个11到底是啥意思?是11位的意思吗?你是否也想过这个问题,是否也有这个疑问?
ok,今天就展开来讲一下,用通俗易懂的大白话来给你彻底搞明白
一、跟你扯点二进制的小东西
要讲清楚这个问题,我先来给大家科普一点计算机比较基础的二进制的东西
1byte 也就是 一字节 等于 8个bit位(也就是8个比特位),稍微接触过计算机知识的,这个应该都知道,没啥疑问吧?
好,那接下来,我再问个问题:一字节 也就是8bit 到底代表啥意思?或者说一字节 8bit 到底能干啥呢? 它能干的事可太多了,但是它具体能干啥,我先不说,先看我下面要说的内容,看懂了下面我写的内容,相信你会有所收获的。
为了解答以上的疑问,继续抛出问题:我问你,0000 0000 这8个位置 用 0 1 来表示能排列组合出多少种组合?
0000 0000
0000 0001
0000 0010
0000 0011
0000 0100
...........
1111 1111
等等等等,我就不一 一列举了
你会发现,这不就是二进制一个一个的往下写吗?
对,就是二进制一个一个的往下排着写,写完之后,你数数排列出了多少种情况?(你别真去数啊,百度一下就行了····)
我帮你数过了,是256种
也就是说,8个位置 如果用0 和1 来排列组合的话,一共能排列组合出256种情况。
一个字节 8个bit位 说完了
那两个字节 16个bit位呢
三个字节 24个bit位呢
四个字节 32个bit位呢
八个字节 64个bit位呢?
好,你不用一个一个数(百度)了,我给你数好了
两个字节 16个bit位:65536种
三个字节 24个bit位:16777216种,也就是1600多万。太具体的不用记,就记住1600万多就行了
四个字节 32个bit位:4294967296种,也就是42亿多。太具体的不用记,就记住42亿多就行了
八个字节 64个bit位:18446744073709551616,也就是一个20位的数。就记住是一个20位的数就行了。
等等等等,中间没说的5个字节,6个字节,7个字节,以及后边更多的字节,就不用我一一列举了吧?
二、mysql中的数据类型分析:整数类型
好,明白了上边我说的这些之后,下边我把mysql中整数型的各个数据类型给你列举出来,把mysql中的这些数据类型和上边说的:
一个字节、两个字节、三个字节、四个字节、八个字节一 一对应起来
mysql的整数型数据类型:
tiny int 一个字节
small int 两个字节
medium int 三个字节
int 四个字节
big int 八个字节
到这里,脑子里有点感觉了吗?
有的小伙伴可能已经想到了:按照这个套路推理的话,很容易就能得出以下的结论:
tiny int 一个字节,它能表示的范围是 0-255 (一共256个坑位)
small int 两个字节,它能表示的范围是 0-65535(一共65536个坑位)
medium int 三个字节,它能表示的范围是 0-1600多万(一共1600万多个坑位)
int 四个字节 ,它能表示的范围是 0-42亿多(一共42亿多坑位)
big int 八个字节,它能表示的范围是0-18446744073709551615(一共18446744073709551616个坑位)
但是,可能有人知道或者百度了,说 不对啊,百度上说 tiny int 的范围是 -128 到 127啊
对,百度上没说错,但是说 -128 到 127的 他们说的都是默认有符号的情况
那啥叫有符号啊?就是有正有负呗
你可以看下mysql你建表建字段的时候,它会让你勾选 是否无符号的
它默认是有符号的 是 -128 到 127的,你勾选了无符号,那就是 0-255了
到这里,没啥疑问吧?
好,继续思考,
那有符号的情况下,mysql为啥非得规定是 -128 到 127呢?为啥非得是负的比正的多一个呢?为啥就不能是 负-127到正128呢???能想到这个问题非常好,说明你真正的用脑子思考了。
针对或者问题,我的理解是:反正坑位一共就256个坑位,看你想往里填什么了,mysql的设计者以及大部分语言的设计者都很默契的一致认为往里填负128 到 正127的这些值更为合理,至于为啥更合理,我觉得这是个经验值,设计成负128到正127在实际的应用中更合理,我也觉得人家设计的没毛病挺合理的,哈哈
理解了吗?还不理解的话,我再给你举个更极端的例子
比如你已经牛逼到能自己设计发明数据库了,然后你发明了个数据库,你就是想在你发明的数据里定义一种数据类型叫 mytiny int,你规定它占一个字节,然后一个字节能表示出256种排列组合的可能性,也就是一个字节能表示256个坑位,然后你就非得规定这256个坑位里装 -100到155这256个数,完全没问题,看你怎么设计了!当然了,举这个例子只是为了帮助你更容易去理解我说的这些知识点,在实际中,不会有人这么傻这么偏激的去把一个byte的数据类型设计成 -100 到 155 这个范围的,因为这么做在大部分实际的应用场景中是不合理的,或者用起来是不方便的
像人家mysql数据库以及Java等一些编程语言是给众多的开发者用的,他们设计的时候得考虑实际操作中的合理性。
上边我写了一句话:反正坑位一共就256个坑位,看你想往里填什么了。记住!我觉得理解这句话非常非常重要。
真正理解了这句话,你很容易就能理解以下两点:(以及刚才我上边说的一字节 也就是8bit 到底代表啥意思?或者说一字节 8bit 到底能干啥呢? 它能干的事可太多了)
1、强类型语言里的一些数据类型为啥是这么设计了,比如Java里的整型数据 byte、short、int、long,等等等
2、你会对编码表有一个新的认识与理解,你会慢慢的理解计算机刚开始是怎么一点点认识美国的abc这种文字、计算机是怎么认识中国的汉字、是怎么认识韩国的韩文、日本的日文,等等等世界上全部国家的文字。为啥美国的ASCII编码占1个字节,为啥中国的gbk gb2312编码占2个字节,以及Unicode、UTF-8的由来等等。
美国的ASCII编码占1个字节,是因为一个字节 8个bit位能排列组合出256个坑位,256个坑位就已经足以把美国键盘上的字母、数字、符号全部包含进去了,标准的键盘上所有的键位一共是104个,256个坑位去装104个内容足以了。中国的gb2312、gbk 占2个字节是为啥呢?因为中国的文字太多了,一个字节256个坑位肯定装不下啊,所以,一个字节不够,那两个字节够吗?上边已经讲过了,2个字节 16个bit位,能排列组合出65536个坑位,那65536个够装所有的汉字吗?答案是不够,因为所有的汉字是9万多个,但是为啥gb2312、gbk还用2个字节来装汉字呢?因为虽然所有的汉字是9万多,但是有很多基本上用不到的,所以刚开始的gb2312它是收录了6763个比较常用的汉字,后期的gbk对汉字编码做了扩充,它收录了汉字和中文符号21886个,所以2个字节也足够了。
这就是为啥不同的字符集编码占的字节数不同的原因了
感兴趣可以看下我另外一篇文章:大白话系列之——聊一聊各种编码表的由来ASCII、GB2312、GBK、Unicode、UTF-8等
我最近开通了几个专栏,里边有更多用大白话讲的干货,里边有更多我自己理解的一些知识点,绝对干货,不拖泥带水,感兴趣的小伙伴可以去看看,专栏持续更新中,后期会持续更新更多的大白话干货
通俗易懂的大白话干货系列
带你玩转实际工作中的Jenkins系列
好了,讲了这么多,其他几个整数型的数据类型以及其他更多的数据类型就不过多的讲了,以此类推很容易理解的
三、int(11),这个11到底是啥?
还有一种情况可能很多人都会误解,比如在mysql里定义一个字段的类型为 int(11)
很多人可能都会简单的认为这个11代表的意思 就是这个字段能存的最大值是11位
我再定义一个字段为int(5),那这个字段最大值就是5位的。
这是不对的,而且是个非常大的误解!
那它到底是啥意思,继续往下看,我会给你整的明明白白的
mysql里的定义一个数据为int(11),代表的并不是这个数据最大只能11位,在mysql里一个字段的数据类型一旦确定了以后,那这个字段最大能表示值也就确定了,它的最大值也就是你定义的这种数据类型的最大值(也就是我上边讲的有符号和无符号的数值范围)
比如 tiny Int,有符号的最大值是127,无符号的最大值是255
small Int ,有符号的最大值是32,767,无符号的最大值是65535
medium int ,有符号的最大值是8,388,607,无符号的最大值是16,777,216
int ,有符号的最大值是2,147,483,647,无符号的最大值是4,294,967,296
这四种类型的最大值其实我上边已经说过了
需要注意的是这个类型能表示的最大值,以及能表示的数值范围,是根据你选择的是有符号还是无符号,是不一样的。
也就是说,你定义了这个字段 是 int型的,并且定义了它默认是有符号的,那它的最大值以及最大的位数就已经定了,是:2,147,483,647,和你int(x) 后边括号里的这个数是没关系的!
好,知道了这些之后,下边继续讲
那这个int(11) 这个11到底是啥?我定义这个11有啥用呢?
答案就是:这个11是mysql规定的数据显示的宽度,那啥叫显示的宽度?
mysql有个选项叫 是否填充0
比如:你定义一个字段数据类型是int(5),而且你勾选了需要填充0,那你存一个1进去,mysql给你展示出来的就是 00001,也就是说你存的数据,位数不够5位的话前边补0,我下面的截图,看到了吗?
那int能表示的最大值绝对不止5位啊,那我如果存一个大于5位的数进去呢?
比如我存一个12345666进去,会怎么样?
它能让你存进去,而且它显示的时候也不会把超过5位后的给你截取掉只给你显示前5位,它是正常的全部给你显示,下图看到了吗
也就是说这个填充0,针对的只是位数不够的情况,如果不够的话,前边会补0
如果大于指定的位数,它不会做任何处理
我觉得理解上边我说的这一点非常非常重要!!!很多人都没搞不明白,至少我身边的很多人都是没明白,都是稀里糊涂的在用
ok,关于mysql中的数据类型我就分享先分享这么多吧,希望对你能有帮助
如果觉得文章对你有所帮助,可以点关注,点赞。纯手打,原创不易,也可以支持订阅一下专栏,里边有更多用大白话讲的干货,都是我自己理解的一些知识点,绝对干货,不拖泥带水!专栏持续更新中,后期会持续更新更多的大白话干货