详细深入聊一聊Mysql中的int(1)和int(11)

目录
  • 前言
  • 正文
    • java
    • mysql
  • 总结

前言

首先在吐槽这个现象前,我先说下我们该篇的内容。

1.  int 类型表字段 在mysql数据库里面,到底存值的范围是多少 ?

什么时候是  -2147483648到 2147483647  

什么时候是 0 到4294967295

2. int (1) int(11) 这个括号后面的玩意,对于int来说 作用是什么?

int(1) 就只能存入 0,1,2,3,4,5,6,7,8,9 吗?
是这样理解??? 我存个10不行?

可能对这些概念很清晰的人会觉得这篇文章没有意义,是的。我一开始直到刚才我还是这样认为。

但是刚刚我身边的 研发们无意讨论这个事情,我才知道,原来不是应届生,是很多搞了很多年的人原来都没搞明白这些东西。

那么我猜测是不是还有很多兄弟们是没弄清晰的, 科普性的文章非常有必要。

正文

java

int 的 范围 :

首先   int             4   字节  ;

一个字节 8位,  4×8 =32  位  ;

所以范围大小是     -2^31~2^31 -1  (-2147483648 ~ 2147483647)  。

mysql

int 的 范围 :

首先   int         4字节  ;

一个字节 8位,  4×8 =32  bit  ;

所以范围大小是     -2^31~2^31-1   (-2147483648 ~ 2147483647)

注意了,对于mysql来说,int 默认是 这样的。

但是还存在  unsigned(无符号)  int ,什么意思呢,也就是无符号,将负的范围分配到正去了,所以    unsigned(无符号)  int 的范围大小 是  0 到4294967295    。

接下来到了很无语的  int(1) 环节 。。

首先我先说结论, int (1)  在mysql 里面 是指 显示 长度  !!! 

跟存值范围没半毛钱关系 !跟存值范围没半毛钱关系 !跟存值范围没半毛钱关系 !

建表 test  ,表结构 如 :

存值, num 直接存入int (有符号) 的最大值 :  2147483647

INSERT INTO `test` (`num`) VALUES (2147483647); 

可以看到正常存储, 而并不是说 int(1) 就 是 只能 存 1位整数............  希望之前还懵的人从此刻起,必须要纠正这个观念了。 对于int类型,不要有这种错误的理念了!!!

ps : 存入一下更大的值  2147483648 ,可以看到提示超过范围了  。

然后可能有人有疑惑了,为什么经常很多同事动不动就 int(10) int(11)呢?

ps: 包括我身边的同事, 还会顺口说一句, 10够用了 ,11够用了之类的话.......
也是让人很无语呢。

其实这10和11 来源也是有说法的,记得前文我说的,对于mysql 创建int 类型,默认就是有符号。 也就是说范围在 -2147483648 ~ 2147483647  。

2147483647   长度 10

-2147483648 长度 11

所以 int (显示长度)  弄 int (10 ) 和  int(11)  自然就知道是啥意思了。

那如果我就不用负数,要弄成 int (无符号)使用  ,怎么操作?

 alter test modify num int unsigned;

可以看到默认帮我们 int 改成无符号的 int时候,是int (10) ,这是最合理的。为什么,还是因为这个显示长度的概念, 无符号的int 范围在   0 ~ 4294967295

4294967295   长度 10 ;

OK,我就是要违反这个默认给的10 , 我改成 int(1) :

alter test modify num int(1) unsigned;

然后随便插入一个值, 12345678 :

insert into  test (num) values (12345678);

没错,对于存在根本没影响。

所以就是说, 我们要知道

int 类型字段 ,在mysql 里面 ,括号后面的 数字, 跟存储的int 数值 范围 

半毛钱关系没有!!!

那至于就是想用的比较 安心一点(强迫症) ,

那如果是 默认int (默认是有符号),那你就int(11) 好了;

如果是    无符号 unsigned int ,那你就int (10) 好了。

但是我最后还是很倔强提一句,记住,半毛钱关系没有!

最后给大家说一哈几个小事,

① 最好在建表的时候就考虑好 int字段是有符号还是无符号,或者说最大想要存入的值的范围。

因为如果你一开始设置无符号  unsigned int ,存入了 大于 2147483647(有符号int的最大值),然后想调整 int字段 从 无符号变成有符号, 这时候会报错、

② int 有符号不够用,还可以用 bigint  8字节,
8×8=64 位  ,-2^63~2^63-1  (-9223372036854775808~9223372036854775807)

③ navicat上面 看 只显示3位长度 这件事,不必纠结这个navicat

navicat 操作界面 :

官方也给过解释:

MySQL Server 8.0.17 deprecated the display width for the TINYINT, SMALLINT, MEDIUMINT, INT, and BIGINT data types when the ZEROFILL modifier is not used, and MySQL Server 8.0.19 has removed the display width for those data types from results of SHOW CREATE TABLE, SHOW CREATE FUNCTION, and queries on INFORMATION_SCHEMA.COLUMNS, INFORMATION_SCHEMA.ROUTINES, and INFORMATION_SCHEMA.PARAMETERS (except for the display width for signed TINYINT(1)). This patch adjusts Connector/J to those recent changes of MySQL Server and, as a result, DatabaseMetaData, ParameterMetaData, and ResultSetMetaData now report identical results for all the above-mentioned integer types and also for the FLOAT and DOUBLE data types. (Bug #30477722)

从8.0.17版本开始,TINYINT, SMALLINT, MEDIUMINT, INT, and BIGINT类型的显示宽度将失效。

总结

到此这篇关于Mysql中int(1)和int(11)的文章就介绍到这了,更多相关Mysql中int(1)和int(11)内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mysql int(3)与int(11)的区别详解

    mysql int(3)与int(11)的区别 总结,int(M) zerofill,加上zerofill后M才表现出有点点效果,比如 int(3) zerofill,你插入到数据库里的是10,则实际插入为010,也就是在前面补充加了一个0.如果int(3)和int(10)不加zerofill,则它们没有什么区别.M不是用来限制int个数的.int(M)的最大值和最小值与undesigned有关,最下面那副图有说明. mysql> create table t (t int(3) zerofil

  • MySQL中int (10) 和 int (11) 的区别

    mysql 中整数数据类型: 不同类型的取值范围: 不同数据类型的默认v显示宽度: 显示的宽度跟负号没有关系,它只在人工设置了 ZEROFILL 属性有效.一旦人工设置了 ZEROFILL 属性,MySQL 会自动设置 UNSIGNED 属性(即 ZEROFILL 不能存储负数). 那取值范围和显示宽度到底有什么关系呢?利用 tinyint 做了个实验, 首先创建一张表如下: mysql> desc test_integer; +-----------+------------+------+-

  • 详细深入聊一聊Mysql中的int(1)和int(11)

    目录 前言 正文 java mysql 总结 前言 首先在吐槽这个现象前,我先说下我们该篇的内容. 1.  int 类型表字段 在mysql数据库里面,到底存值的范围是多少 ? 什么时候是  -2147483648到 2147483647   什么时候是 0 到4294967295 2. int (1) int(11) 这个括号后面的玩意,对于int来说 作用是什么? int(1) 就只能存入 0,1,2,3,4,5,6,7,8,9 吗?是这样理解??? 我存个10不行? 可能对这些概念很清晰的

  • mysql中int、bigint、smallint 和 tinyint的区别详细介绍

    最近使用mysql数据库的时候遇到了多种数字的类型,主要有int,bigint,smallint和tinyint.其中比较迷惑的是int和smallint的差别.今天就在网上仔细找了找,找到如下内容,留档做个总结: 使用整数数据的精确数字数据类型. bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字).存储大小为 8 个字节. P.S. bigint已经有长度了,在mysql建表中的len

  • MySQL中int(n)后面的n到底代表的是什么意思

    你可能已经知道int(1)这个长度1并不代表允许存储的宽度! 但对这个长度很多人也没有真正研究过到底代表什么,今天我就来简单的分析一下! 先看一个简单的建表小案例: create table test( id int(11) unsigned NOT NULL AUTO_INCREMENT, uid int(3) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 这里以uid字段为例,我们这里设置的是int(3

  • Mysql中复制详细解析

    1.mysql复制概念 指将主数据库的DDL和DML操作通过二进制日志传到复制服务器上,然后在复制服务器上将这些日志文件重新执行,从而使复制服务器和主服务器的数据保持同步.复制过程中一个服务器充当主服务器(master),而一个或多个其它服务器充当从服务器(slaves).主服务器将更新重新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器.从服务器在日志中读取的最后一次成功更新的位置.从服务器接受从那时起发

  • mysql中binlog_format模式与配置详细分析

    mysql复制主要有三种方式:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, MBR).对应的,binlog的格式也有三种:STATEMENT,ROW,MIXED. ① STATEMENT模式(SBR) 每一条会修改数据的sql语句会记录到binlog中.优点是并不需要记录每一条sql语句和每一行的数据变化,减少了binl

  • MySQL中int最大值深入讲解

    导语 前两天看到的问题,展开写一下. 字节 我们都知道计算机是以二进制为基础.存储的基本单位是 Bit,也称为比特.二进制位.1bit 可以表示 0 或者 1 两个数字,是可能存在的最小的信息量,任何小于1 bit 的内容都算不上信息. 复杂的内容就要用多 bit 来表示.Byte ,也称为字节,通常用作计量单位.1 byte 等于 8 bit,即 1 byte 可以表示 28 内容. MySQL 中的字节 先说明一下,在 MySQL 中的整数类型,可以分为 unsigned 和 signed

  • 详细谈谈MYSQL中的COLLATE是什么

    前言 在mysql中执行show create table <tablename>指令,可以看到一张表的建表语句,example如下: CREATE TABLE `table1` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `field1` text COLLATE utf8_unicode_ci NOT NULL COMMENT '字段1', `field2` varchar(128) COLLATE utf8_unicode_ci

  • mysql中int(3)和int(10)的数值范围是否相同

    目录 提问: 回答: 真实情况: 知识点 结论: 总结 提问: mysql的字段,unsigned int(3), 和unsinged int(6), 能存储的数值范围是否相同.如果不同,分别是多大? 回答: 不同,int(3)最多显示3位无符号整体,int(6)最多显示6位无符号数. 如果你的答案和上面的一致,恭喜你和我犯了一样的错误. 真实情况: int类型整数占4个字节,有符号的范围为:-2^31 ~ 2^31-1,无符号整数范围为:0 ~ 2^32-1,既然都是无符号整数,那么存储范围是

  • 详细聊聊MySQL中的LIMIT语句

    目录 问题 server层和存储引擎层 那LIMIT是什么鬼? 怎么办? 吐个槽 最近有多个小伙伴在答疑群里问了小孩子关于LIMIT的一个问题,下边我来大致描述一下这个问题. 问题 为了故事的顺利发展,我们得先有个表: CREATE TABLE t ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, key1 VARCHAR(100), common_field VARCHAR(100), PRIMARY KEY (id), KEY idx_key1 (key1

  • 详解Mysql中tinyint与int的区别

    问题:int(1) 和 tinyint(1) 有什么区别呢? 像这样的设计,反正我是不会写int(1)的. 查了下,mysql中设置了储存类型后,储存是定长的,也就是说,int(1) 和 int(4) 在硬盘中所占的字节数都是一样的. 我们知道,int类型占4个字节,tinyint占1个字节.int(1) 和 int(4) 从本身长度还是存储方式上都是一样的,区别就是显示的长度不同,但是要设置一个参数:如果列制定了zerofill 就会用0填充显示,int(4)指定后就会显示为0002. int

随机推荐