欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL INT类型全解析

程序员文章站 2022-04-01 13:08:47
前言:整型是mysql中最常用的字段类型之一,通常用于存储整数,其中int是整型中最常用的,对于int类型你是否真正了解呢?本文会带你熟悉int类型相关知识,也会介绍其他整型字段的使用。1.整型分类及...

前言:

整型是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=8b 1kb=1024b 1mb=1024kb

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

2.存储范围测试

mysql> create table test_int (  -> col1 tinyint,  -> col2 smallint,  -> col3 mediumint,  -> col4 int,  -> col5 bigint  -> ) engine = innodb default charset = utf8;query ok, 0 rows affected (0.01 sec)
mysql> show create table test_int\g*************************** 1. row ***************************    table: test_intcreate table: create table `test_int` ( `col1` tinyint(4) default null, `col2` smallint(6) default null, `col3` mediumint(9) default null, `col4` int(11) default null, `col5` bigint(20) default null) engine=innodb default charset=utf81 row in set (0.00 sec)
mysql> insert into test_int values (1234,123456,12345678,12345678901,12345678901234567890);query ok, 1 row affected, 5 warnings (0.00 sec)
mysql> insert into test_int values (-1234,-123456,-12345678,-12345678901,-12345678901234567890);query ok, 1 row affected, 5 warnings (0.01 sec)
mysql> show warnings;+---------+------+-----------------------------------------------+| level  | code | message                    |+---------+------+-----------------------------------------------+| warning | 1264 | out of range value for column 'col1' at row 1 || warning | 1264 | out of range value for column 'col2' at row 1 || warning | 1264 | out of range value for column 'col3' at row 1 || warning | 1264 | out of range value for column 'col4' at row 1 || warning | 1264 | out of range value for column 'col5' at row 1 |+---------+------+-----------------------------------------------+5 rows in set (0.01 sec)
mysql> select * from test_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> create table test_int_zerofill (  -> col1 int(5) zerofill,  -> col2 int zerofill,  -> col3 int(5)  -> ) engine=innodb default charset=utf8;query ok, 0 rows affected (0.01 sec)
mysql> show create table test_int_zerofill\g*************************** 1. row ***************************    table: test_int_zerofillcreate table: create table `test_int_zerofill` ( `col1` int(5) unsigned zerofill default null, `col2` int(10) unsigned zerofill default null, `col3` int(5) default null) engine=innodb default charset=utf81 row in set (0.00 sec)
mysql> insert into test_int_zerofill values (12,12,12);query ok, 1 row affected (0.00 sec)
mysql> select * from test_int_zerofill;+-------+------------+------+| col1 | col2    | col3 |+-------+------------+------+| 00012 | 0000000012 |  12 |+-------+------------+------+1 row in set (0.00 sec)

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

create table `t_zerofill` (  `year` year(4) default null,  `month` int(2) unsigned zerofill default null,  `day` int(2) unsigned zerofill default null ) engine=innodb default charset=utf8;
mysql> insert into t_zerofill values (2019,6,5);query ok, 1 row affected (0.01 sec)
mysql> insert into t_zerofill values (2019,6,18);query ok, 1 row affected (0.00 sec)
mysql> insert into t_zerofill values (2019,10,1);query ok, 1 row affected (0.00 sec)
mysql> insert into t_zerofill values (2019,11,11);query ok, 1 row affected (0.01 sec)
mysql> select * from t_zerofill;+------+-------+------+| year | month | day |+------+-------+------+| 2019 |  06 |  05 || 2019 |  06 |  18 || 2019 |  10 |  01 || 2019 |  11 |  11 |+------+-------+------+4 rows in set (0.00 sec)

4.类型选取

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

以上就是mysql int类型全解析的详细内容,更多关于mysql int类型的资料请关注其它相关文章!

相关标签: MySQL int