mysql存储之int
开始之前给大家出个问题,数据库表test中两个字段 a int(2),b int(3),现在想执行下面的插入语句
insert into test VALUES(1111111111,1111111111)
思考是否可以插入? 答案是能插入
再看下面的语句
insert into test VALUES(1111111111,1111111111)
思考能不能插入?注意第一个数字多了一位变成了11位
数据库会报如下错误 “Out of range value for column 'id' at row 1” 数据长度超长
这是为什么呢?让我们一起来进入正题。
首先看一下mysql每个整数类型的存储范围(图片来源于网络)
INT[(M)] [UNSIGNED] [ZEROFILL] (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组成);
所以mysql中的数据类型定位int时,长度固定了(占用4个字节,32位二进制,无符号时最大值为2的32次方4294967295 二进制位10位);
思考:我们平时定义的int类型都写成int(11)的原因是什么?
回到最初的问题 :虽然定义的显示长度为2和3个十进制位,但是当前数据结构能存储的是10个十进制位,占用32个二进制位。所以第一组数据能存储进去,第二组数据无法存储进去。
总结:mysql中int类型的数据定义的长度(M)为显示长度,不影响实际存储的数值的大小,int类型的数据存储范围根据有无符号会有不同,最长不超过11位十进制;
tips:
当设置了zerofill的时候:添加zerofill的时候系统会给自动添加上unsigned属性。就是非负数(UNSIGNED)。
不足M位的部分会用0填充,比如 int(4),而插入的值为23,那么显示的值为0023;
如果插入的是负数比如-123,将不允许插入([Err] 1264 - Out of range value adjusted for column 'XX' at row 1)
https://www.cnblogs.com/lsgspace/
原创作品欢迎转载,转载请注明出处
标签:
mysql
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构