数据库教程:MySQL INT类型全解析分享

前言:

整型是MySQL中最常用的字段类型之一,通常用于存储整数,其中int是整型中最常用的,对于int类型你是否真正了解呢?本文会带你熟悉int类型相关知识,也会介绍其他整型字段的使用。

1.整型分类及存储范围

整数类型 字节 有符号范围 无符号范围 TINYINT 1 -128~127 0~255 SMALLINT 2 -32768~32767 0~65535 MEDIUMINT 3 -8388608~8388607 0~16777215 INT/INTEGER 4 -2147483648~2147483647 0~4294967295 BIGINT 8 -9223372036854775808~9223372036854775807 0~18446744073709551615

表格一共有四列分别表示:字段类型,占用字节数,有符号范围,无符号范围。
我们拿int类型为例:
int类型,占用字节数为4byte,学过计算机原理的同学应该知道,字节(byte)并非是计算机存储的最小单位,还有比字节(byte)更小的单位,也就是位(bit),一个位就代表一个0或1;8个位组成一个字节;一般字节用大写B来表示byte,位用小写b来表示bit.

计算机存储单位的换算:1B=8b1KB=1024B1MB=1024KB

那么根据int类型允许存储的字节数是4个字节,我们就能换算出intUNSIGNED(无符号)类型的能存储的最小值为0,最大值为4294967295(即4B=32b,最大值即为32个1组成,即4294967295换算成二进制则是32个1)。

2.存储范围测试

mysql>CREATETABLEtest_int(->col1TINYINT,->col2SMALLINT,->col3MEDIUMINT,->col4INT,->col5BIGINT->)ENGINE=INNODBDEFAULTCHARSET=utf8;QueryOK,0rowsaffected(0.01sec) mysql>showcreatetabletest_intG***************************1.row***************************Table:test_intCreateTable:CREATETABLE`test_int`(`col1`tinyint(4)DEFAULTNULL,`col2`smallint(6)DEFAULTNULL,`col3`mediumint(9)DEFAULTNULL,`col4`int(11)DEFAULTNULL,`col5`bigint(20)DEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf81rowinset(0.00sec) mysql>insertintotest_intvalues(1234,123456,12345678,12345678901,12345678901234567890);QueryOK,1rowaffected,5warnings(0.00sec) mysql>insertintotest_intvalues(-1234,-123456,-12345678,-12345678901,-12345678901234567890);QueryOK,1rowaffected,5warnings(0.01sec) mysql>showwarnings;+---------+------+-----------------------------------------------+|Level|Code|Message|+---------+------+-----------------------------------------------+|Warning|1264|Outofrangevalueforcolumn'col1'atrow1||Warning|1264|Outofrangevalueforcolumn'col2'atrow1||Warning|1264|Outofrangevalueforcolumn'col3'atrow1||Warning|1264|Outofrangevalueforcolumn'col4'atrow1||Warning|1264|Outofrangevalueforcolumn'col5'atrow1|+---------+------+-----------------------------------------------+5rowsinset(0.01sec) mysql>select*fromtest_int;+------+--------+----------+-------------+----------------------+|col1|col2|col3|col4|col5|+------+--------+----------+-------------+----------------------+|127|32767|8388607|2147483647|9223372036854775807||-128|-32768|-8388608|-2147483648|-9223372036854775808|+------+--------+----------+-------------+----------------------+

从上述测试中我们可以看出:有符号时,各种整型类型最大的存储范围,当存储数字大小不在存储范围时,MySQL会产生告警,但数字可以插入,默认截取为可存储的最大值或最小值。

3.int(M)中M的含义与zerofill的使用

我们经常听到这句话:int(M)中的M代表最大显示宽度,”最大显示宽度”我们第一反应是该字段的值最大能允许存放的值的宽度,以为我们建了int(1),就不能存放数据10了,其实不是这个意思。
整数列的显示宽度与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,比如,不管设定了显示宽度是多少个字符,int都是占用4个字节,bigint都要占用8个字节。即int(5)和int(10)可存储的范围一样。
整型字段有个ZEROFILL属性(0填充),在数字长度不够的数据前面填充0,以达到设定的长度。加上ZEROFILL后M才表现出不同,当使用ZEROFILL时,默认会自动加unsigned(无符号)属性。比如INT(3)ZEROFILL,你插入到数据库里的是10,则实际插入为010,也就是在前面补充加了一个0,下面我们来测试下:

mysql>CREATETABLEtest_int_zerofill(->col1INT(5)ZEROFILL,->col2INTZEROFILL,->col3INT(5)->)ENGINE=InnoDBDEFAULTCHARSET=utf8;QueryOK,0rowsaffected(0.01sec) mysql>showcreatetabletest_int_zerofillG***************************1.row***************************Table:test_int_zerofillCreateTable:CREATETABLE`test_int_zerofill`(`col1`int(5)unsignedzerofillDEFAULTNULL,`col2`int(10)unsignedzerofillDEFAULTNULL,`col3`int(5)DEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf81rowinset(0.00sec) mysql>insertintotest_int_zerofillvalues(12,12,12);QueryOK,1rowaffected(0.00sec) mysql>select*fromtest_int_zerofill;+-------+------------+------+|col1|col2|col3|+-------+------------+------+|00012|0000000012|12|+-------+------------+------+1rowinset(0.00sec)

那么有同学可能会问zerofill有什么应用场景呢,比较常用的应该是月份或日期前补0,这样显示的会规范些

CREATETABLE`t_zerofill`(`year`year(4)DEFAULTNULL,`month`int(2)unsignedzerofillDEFAULTNULL,`day`int(2)unsignedzerofillDEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8; mysql>insertintot_zerofillvalues(2019,6,5);QueryOK,1rowaffected(0.01sec) mysql>insertintot_zerofillvalues(2019,6,18);QueryOK,1rowaffected(0.00sec) mysql>insertintot_zerofillvalues(2019,10,1);QueryOK,1rowaffected(0.00sec) mysql>insertintot_zerofillvalues(2019,11,11);QueryOK,1rowaffected(0.01sec) mysql>select*fromt_zerofill;+------+-------+------+|year|month|day|+------+-------+------+|2019|06|05||2019|06|18||2019|10|01||2019|11|11|+------+-------+------+4rowsinset(0.00sec)

4.类型选取

经过上面的介绍,关于不同整型字段的选取变得容易很多。本着最小化存储的原则,当然是能选TINYINT不选SMALLINT,能选MEDIUMINT不选INT了,不过一切都要满足业务的前提下尽量选取占用字节更少的类型。对于确定只存储正整数的字段,可以加上unsigned属性,这样会使存储范围更大,比如当字段有AUTO_INCREMENT属性时,我们可以为int类型加上unsigned属性。

上述就是数据库技术:MySQL INT类型全解析分享的全部内容,如果对大家有所用处且需要了解更多关于mysql数据库学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/dtteaching/909257.html

(0)
上一篇 2021年10月23日
下一篇 2021年10月23日

精彩推荐