首页 > 数据库 >MySQL int(10) 与 int(11) 的区别

MySQL int(10) 与 int(11) 的区别

时间:2024-09-09 10:52:19浏览次数:13  
标签:11 10 int AUTO ZEROFILL INCREMENT NULL 属性

不知道大家是不是和我一样,每次给有个列添加 int(11) 的时候都会想,会不会是 int(10) ,偶尔也会发神经的想,如果 int(32) 这样的可否?

索性,我们就先来解决这个问题吧。

int 类型的底层存储采用的是 4 字节,也就是 32 位,这样能够存储的实际最大值为 4 294 967 296,大家数数一下这个数字,总共有多少位 ?

对的,没错,就是 10 位,所以,感觉 int(11) 这个应该是错误的 ? 实际上,真的错了吗 ?

没有,因为我们演示的是无符号整型的情况,而对于有符号整型,范围是 -2 147 483 648 到 2147483648,大家数一数最小值,是不是就 11 位了

所以,int(11) 就是这么来的,而且也不会错。

但这到底是什么道理呢 ?

为了搞清楚弄明白,我们就必须去了解 MySQL 是如何对待数据类型上的属性的。

数值类型的宽度显示属性

对于所有的数值类型,MySQL 通过扩展的方式,可以有选择性的在类型的 base 关键字后面的括号中指定 「 整数 」 数据类型的 「 显示宽度 」 。

注意: 我们使用 「」 括号扩起来的 整数 和 显示宽度 两个词。

例如,例如,INT(4) 指定显示宽度为 4 位的 INT。对于一个类型为 INT(4) 的列,实际存储仍然使用 4 个字节,但显示的时候就有有细微的差别:

  1. 如果给该列传递的值大于等于四位,比如 5201314,那么显示的时候会使用原值,也就是显示 5201314
  2. 但如果给该列传递的值小于四位,比如 520 ,那么显示的时候就会在左边填充 0,也就是显示位 0520

我们举一个例子,假设我们有一个表如下

CREATE TABLE `na` (
    n1 INT(4) NOT NULL DEFAULT '0',
    n2 INT(4) ZEROFILL NOT NULL DEFAULT '0'
);

然后插入一些数据

mysql> INSERT INTO `na` VALUES(520,520),(5201314,5201314);
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0

最后我们看看显示的结果

mysql> SELECT * FROM `na`;
+---------+---------+
| n1      | n2      |
+---------+---------+
|     520 |    0520 |
| 5201314 | 5201314 |
+---------+---------+
2 rows in set (0.01 sec)

对比下 n1 和 n2 ,n1 是不是在位数不满足的时候会填充前导的 0

从演示结果上来看,显示宽度不会限制可以存储在列中的值的范围,也不会阻止比列显示宽度更宽的值正确显示。例如刚刚的范例,指定为 INT(4) 的列的取值范围为 -2 147 483 648 到 2147483648 ,超过四位数允许范围之外的值将使用四位数以上显示

当列添加了 ZEROFILL 约束时 ( 注意,这并不是 SQL 标准的一部分 ),会使用 0 代替默认的默认的空格 ' ' 。例如,对于声明为 INT(4) ZEROFILL 的列,会将值 5 显示为 0005

注意

在表达式或 UNION 查询中涉及列时,会自动忽略 ZEROFILL 属性。

使用 ZEROFILL 属性时要注意,如果将大于显示宽度的值存储在具有 ZEROFILL 属性的整数列中,为某些复杂连接生成临时表时可能会遇到问题。因为在这些情况下,MySQL 会假定数据值符合列显示宽度

数值类型的 UNSIGNED 显示属性

所有整数类型都可以具有可选 ( 非标准 ) 属性 UNSIGNED 。无符号类型可用于仅允许列中的非负数或当需要更大的列的上限数字范围时。例如,如果 INT 列为 UNSIGNED,则列的范围大小相同,终端显示时范围从 -2147483648 和 2147483647 更改为 0 和 4294967295

从某些方面说,就是 UNSIGNED 属性并不会更改底层的数据存储格式,仍然是 SIGNED 有符号整数,但在显示时,会将有符号的值自动转换为无符号的值。也就是说 UNSIGNED 也是一个显示属性

浮点和精确精度类型也可以是 UNSIGNED ,与整数类型一样,此属性可防止负值存储在列中。但与整数类型不同,列值的上限范围保持不变。

数值类型的 ZEROFILL 显示属性

ZEROFILL 列的属性,我们刚刚介绍过了,这里就不重复介绍了。

如果为数值列指定了 ZEROFILL ,MySQL 会自动添加 UNSIGNED 属性到列中。

数值类型的 AUTO_INCREMENT 属性

整数或浮点数据类型可以添加附加属性 AUTO_INCREMENT。如果某个列添加了 AUTO_INCREMENT 属性,那么在插入数据的时候,如果不指定该列或者指定该列的值为 NULL ,那么 MySQL 会自动将该列的值设置为下一个序列值

通常,值为 value+1 ,其中 value 是表中当前列的最大值。

注意:AUTO_INCREMENT 序列以 1 开始而不是 0

另一个需要注意的是,将 0 存储到 AUTO_INCREMENT 列与存储 NULL 具有相同的效果,除非启用了 NO_AUTO_VALUE_ON_ZERO SQL 模式。

而对于插入 NULL 以生成 AUTO_INCREMENT 值需要将列声明为 NOT NULL。如果列声明为 NULL,那么插入 NULL 将存储 NULL 。

还有一个需要注意的是,当你将任何其它值插入 AUTO_INCREMENT 列时,该列将设置为该值并重置序列,以便从插入的值开始按顺序执行下一个自动生成的值。所以千万要避免在 AUTO_INCREMENT 指定列值插入,很大概率会发生主键重复的问题

在 MySQL 8.0 及以上的版本, AUTO_INCREMENT 列会自动添加一个隐式的 UNSIGNED 属性来保证插入的值非负。

标签:11,10,int,AUTO,ZEROFILL,INCREMENT,NULL,属性
From: https://www.cnblogs.com/ataoxz/p/18404143

相关文章

  • fmt.Printf 函数用于格式化并打印信息到标准输出
    在Go语言中,fmt.Printf函数用于格式化并打印信息到标准输出。%c和%d是格式化参数中的占位符,用于指定输出的格式。以下是一些常用的格式化参数:%v:默认格式,根据变量的类型自动选择输出格式。%+v:类似 %v,但会输出字段名。%#v:类似 %v,但会输出Go语法表示。%T:输出变量的类型......
  • 51nod 1050 循环数组最大子段和
    51nod1050循环数组最大子段和虽然是板子题,两种做法,我们先写一种,另一个咕咕。因为是循环,所以分为两种,中间的和两边的,中间的直接dp求最大,两边的转化一下就是总的数字和减去中间的最小数字和。#include<bits/stdc++.h>usingnamespacestd;#definelllonglonglla[500005]......
  • 1-10Java方法
    Java方法在前面几个章节中我们经常使用到System.out.println(),那么它是什么呢?println()是一个方法。System是系统类。out是标准输出对象。这句话的用法是调用系统类System中的标准输出对象out中的方法println()。那么什么是方法呢?Java方法是语句的集合,它们在一......
  • Android10源码刷入Pixel2以及整合GMS
    一、ASOP源码下载具体可以参考我之前发布的文章二、下载相关驱动包这一步很关键,关系到编译后的镜像能否刷入后运行下载链接:Nexus和Pixel设备的驱动程序二进制文件如下图所示,将两个驱动程序上传到Ubuntu服务器,并进行解压,得到两个脚本:下载解压后会有两个脚本文件,运......
  • 《花100块做个摸鱼小网站! 》第六篇—将小网站部署到云服务器上
    ⭐️基础链接导航⭐️服务器→☁️阿里云活动地址看样例→......
  • Sprint的工作
    Sprint的工作如下图所示-客户,利益相关者假设有一个客户想要开发他们的软件,他们找到一个基于服务的公司来开发他们的软件。产品拥有者该公司将做什么?公司将指定称为产品所有者的人。客户端与产品所有者进行沟通,产品所有者将捕获客户端的所有需求或用户故事,并将其命名为......
  • 南沙信奥赛C++陈老师解一本通题: 1171:大整数的因子
    ​ 【题目描述】已知正整数k满足2≤k≤9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。【输入】一个非负整数c,c的位数≤30。【输出】若存在满足 c%k==0的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。【输入样......
  • 负重10Kg多旋翼行业无人机技术详解
    随着无人机技术的不断成熟与应用领域的持续拓展,负重型多旋翼无人机已成为行业应用中的重要力量。特别是能够承载10Kg以上载荷的无人机,凭借其卓越的挂载能力、灵活的操控性以及广泛的适用性,在物流运输、农业植保、电力巡检、环境监测等多个领域展现出巨大潜力。本文将从机架与结......
  • 使用AtomicInteger原子类尝试优化分析
    1.使用AtomicInteger原子类尝试优化分析Java的java.util.concurrent.atomic包提供了一些原子类,可以在并发编程中避免显式加锁。最简单的我们可以使用AtomicInteger来替代显式的锁。packageorg.zyf.javabasic.thread.lock.opti;importjava.util.concurrent.atomic.AtomicInteger......
  • ceph:麒麟kylin v10 sp3:安装ceph-nautilus for el8:这个版本依赖于python3.6,看看怎么欺
    [root@kylintemplate~]#catceph-nautilus-el8_depends-for-kylin.specSummary:ceph-nautilus-el8_depends-for-kylinvirtualName:ceph-nautilus-el8_depends-for-kylinVersion:1.0Release:0License:GPLGroup:Development/ToolsAutoReqProv:yesAutoReq:ye......