int类型知多少(代码片段)

author author     2022-12-21     573

关键词:

前言:
整型是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

表格一共有四列分别表示:字段类型, 占用字节数, 有符号范围, 无符号范围。<br />我们拿int类型为例:<br />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_int
Create 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=utf8
1 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了, 其实不是这个意思。<br />整数列的显示宽度与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,比如,不管设定了显示宽度是多少个字符,int都是占用4个字节,bigint都要占用8个字节。即int(5)和int(10)可存储的范围一样。<br />整型字段有个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_zerofill
Create 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=utf8
1 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属性。

技术图片

__attribute__你知多少(代码片段)

__ATTRIBUTE__你知多少?GNUC 的一大特色就是__attribute__ 机制。__attribute__ 可以设置函数属性(FunctionAttribute )、变量属性(VariableAttribute )和类型属性(TypeAttribute )。__attribute__ 书写特征是:__attribu 查看详情

carson带你学android:常见的动画类型你知多少?(代码片段)

...、使用、原理等,让你全面了解Android动画目录1.动画类型Android动画主要分为分为两大类(三种): 查看详情

carson带你学java:泛型知识知多少(代码片段)

...说明:List能否转为List?定义可理解为适配广泛的类型,即参数化类型,可以把类型像方法的参数那样进行传递。//以ArrayList为示例//泛型T可以是任意类publicclassArrayList<T>privateT[]array;//... 查看详情

编码命名方式知多少(代码片段)

...件命令,对目录命名,对变量命名,还有其他类型的资源等等。那么取名时,业界 查看详情

eshoponcontainers知多少[4]:catalogmicroservice(代码片段)

...产品信息的创建、读取、更新和删除(CRUD)操作。这种类型的服务在单个ASP.NETCoreWebAPI项目中即可实现所有功能,该项目包括数据模型类、业务逻辑类及其数据访问类 查看详情

unitofwork知多少(代码片段)

原文链接:https://www.cnblogs.com/sheng-jie/p/7416302.html1.引言Maintainsalistofobjectsaffectedbyabusinesstransactionandcoordinatesthewritingoutofchangesandtheresolutionofconcurrencyproblems.UnitofWork  查看详情

玩转springboot原理篇(核心注解知多少)(代码片段)

type=FilterType.CUSTOM,classes=TypeExcludeFilter.classtype=FilterType.CUSTOM,classes=AutoConfigurationExcludeFilter.classSpringBootApplicationSpringBootConfigurationComponentScanEnableAutoConfiguratio 查看详情

io模型知多少|代码篇(代码片段)

引言之前的一篇介绍IO模型的文章IO模型知多少|理论篇比较偏理论,很多同学反应不是很好理解。这一篇咱们换一个角度,从代码角度来分析一下。socket编程基础开始之前,我们先来梳理一下,需要提前了解的几个概念:socket:直... 查看详情

httpcontent-type知多少(代码片段)

...ntent-Type。Content-TypeContent-Type:实体头部用于指示资源的MIME类型。如果未指定ContentType,默认为text/html有两种场景:在请求中(如POST或PUT),客户端告诉服务器实际发送的数据类型。在响应中,Content-Type标头告诉客户端实际返回的内... 查看详情

[转]梦里babel知多少(代码片段)

平时开发中,经常需要用到ES6/ES7的语法。那么就需要用到Babel来对代码进行转码处理。 之前用Vue比较多,所以以Vue-cli作为参考来分析。 第一张图是几个月前的Vue-cli生成的 第二个图是今天使用Vue-cli生成的Babel-core顾... 查看详情

elasticsearch语法知多少之matchquery(代码片段)

目录目标ES版本信息官方文档相关术语创建相关的索引和文档(数据用于实战案例)创建索引索引文档Matchquery常见参数实战基本语法analyzer(指定分词器查询)operator(解释查询条件的布尔逻辑)minimum_should_match(最少匹配数)fuzzy... 查看详情

gtk4listmodel知多少?(代码片段)

【GTK4】LISTMODEL总结文章目录【GTK4】LISTMODEL总结一、LISTMODEL创建、管理工具1️⃣GtkSliceListModel2️⃣GtkFlattenListModel3️⃣GtkMapListModel二、LISTMODEL的具体应用1️⃣Pangoobjects2️⃣GtkDirectoryList和GtkBookmarkList3️⃣GtkDropDown三、LI 查看详情

gtk4listmodel知多少?(代码片段)

【GTK4】LISTMODEL总结文章目录【GTK4】LISTMODEL总结一、LISTMODEL创建、管理工具1️⃣GtkSliceListModel2️⃣GtkFlattenListModel3️⃣GtkMapListModel二、LISTMODEL的具体应用1️⃣Pangoobjects2️⃣GtkDirectoryList和GtkBookmarkList3️⃣GtkDropDown三、LI 查看详情

asp.netcore反向代理部署知多少(代码片段)

Nginx配置路由转发首先来看下IdentityServer4.Admin的项目结构:IdentityServer4.Admin/├──Id4.Admin.Api#用于提供访问Id4资源的WebApi项目├──Id4.Admin#用于提供管理Id4资源的Web管理面板├──Id4.STS.Identity#用于提供STS服务的Web项目作为... 查看详情

字符串匹配算法知多少?(代码片段)

...代码实现KMP算法一说到字符串匹配算法,不知道会有多少小伙伴不由自主的想起那个kmp算法呢?想到是很正常的,谁让它那么优秀呢。BF算法不要被事物的表面现象所迷惑,这个算法全称:BruteForce,有个拉... 查看详情

oauth2.0知多少(代码片段)

 1.引言周末逛简书,看了一篇写的极好的文章,点击大红心点赞,就直接给我跳转到登录界面了,原来点赞是需要登录的。可是没有我并没有简书账号,一直使用的QQ的集成登录。下面有一排社交登录按钮,我们可以用第三... 查看详情

大前端快闪:package.json文件知多少?(代码片段)

...构建完整的全栈技能体系。快闪一:package.json文件知多少如果你使用了nodejs、npm项目、Angular项目等&#x 查看详情

shell:liteos在线调试工具知多少(代码片段)

摘要:Shell作为HuaweiLiteos在线调试工具,可以通过串口工具输入输出,支持常用的基本调试功能。同时用户可以新增定制的命令,新增命令需重新编译烧录后才能执行本文分享自华为云社区《LIteOS----shell应用(... 查看详情