当前位置: 首页 > 科技观察

互联网大厂访谈:MySQL中int(11)和int(10)有什么区别?

时间:2023-03-16 22:48:37 科技观察

平时我们在创建MySQL表的时候,都会指定各个字段的类型,比如idint(11),namevarchar(20)。那不知道大家有没有想过,int(11)和int(10)有什么区别呢?存储值的范围有区别吗?对于string类型名称varchar(20)的定义,我们可以清楚的知道,这意味着name字段的最大长度为20个字符。当name字段的长度超过20个字符时,MySQL会报错。那么对于int类型,当定义为unsignedint时,最大值范围是4294967295,长度只有10位,那么我们定义int(11)是不是可以突破int类型的上限呢?另外,细心的朋友可能会发现,我们在创建表的时候,如果不指定int类型的长度,MySQL会自动为我们指定长度为int(10)。如果我们指定int(x),则长度将定义为x。其实对于int类型来说,它的最大值和最小值是固定的,定义的int(x)中的x代表的不是长度,而是显示宽度。当定义一个unsignedint类型并设置ZEROFILL属性时,如果value的长度没有达到显示的宽度,MySQL会自动在value的前面填充,直到达到定义的宽度。让我们创建一个新表测试来验证。可以看到我把id的长度定义为8,这是为了让大家看到存储的值超过8时的显示结果。desc视图表结构如下:我们插入两条数据,看具体显示效果.两条记录的主键分别为1和10001000,选择看MySQL如何显示。可以看到,对于第一条记录,由于显示宽度只有1,MySQL在左边增加了7个0,对于第二条记录,它的显示宽度是8,MySQL没有做任何改动。也就是说,当存储数据的宽度不够时,MySQL会在左边补零。那么问题又来了,MySQL引擎存储数据时,存储的是1还是00000001?显然,存储1,00000001只是为了向我们展示。另一件需要注意的事情是zerofill仅适用于正数,因为ZEROFILL属性会将值隐式转换为无符号类型。所以总结一下,int(x)中的x代表它的宽度,它的宽度值不影响存储范围,只是按照定义的宽度显示和格式化。而int类型的width可以定义的范围是多少?-1~10485760。最后,再问你一个问题。宽度的格式化是由MySQL服务器完成的,还是由InnoDB引擎完成的?