mysql存储之int

本文深入解析MySQL中INT类型的存储范围及长度定义,解释为何某些数值无法插入,涉及int类型数据结构、显示长度与实际存储的关系,以及zerofill属性的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开始之前给大家出个问题,数据库表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/p/10397316.html

### 将 MySQL 中的 `varchar` 类型转换为 `int` 类型的方法 在 MySQL 数据库中,将 `varchar` 类型的数据转换为 `int` 类型可以通过多种方式实现。以下是几种常见的方法及其适用场景: #### 方法一:使用加零法 (`+0`) 这是一种简单而有效的方式,适用于数值字符串可以直接转化为整数的情况。通过在字段后面加上 `+0`,MySQL 会自动尝试将该字段解析为数字。 ```sql SELECT * FROM table_name ORDER BY column_name + 0 DESC; ``` 这种方法的优点在于其简洁性和高效性,但在处理非纯数字字符时可能会返回错误的结果或警告[^3]。 #### 方法二:使用 `CAST()` 函数 `CAST()` 是一种标准 SQL 函数,用于显式地将数据从一种类型转换为另一种类型。对于将 `varchar` 转换为 `int`,可以指定目标类型为 `SIGNED` 或 `UNSIGNED` 整数。 ```sql SELECT * FROM table_name WHERE condition ORDER BY CAST(column_name AS SIGNED); ``` 这里,`SIGNED` 表示带符号整数,适合存储正负值;如果仅需表示正值,则可以选择 `UNSIGNED`[^1]。 #### 方法三:使用 `CONVERT()` 函数 类似于 `CAST()`,`CONVERT()` 提供了相同的转换功能,只是语法稍有不同。它可以接受两个参数——待转换表达式以及目标数据类型。 ```sql SELECT * FROM table_name WHERE condition ORDER BY CONVERT(column_name, SIGNED); ``` 无论是采用 `CAST()` 还是 `CONVERT()`,这两种方法都提供了良好的兼容性和清晰度,推荐作为首选方案之一[^2]。 #### 方法四:定义列别名并通过别名操作 有时为了提高查询可读性或者进一步加工数据,可以在 SELECT 子句中创建一个新的计算列,并基于此新列进行后续运算。 ```sql SELECT *, CAST(column_name AS SIGNED) AS converted_column FROM table_name ORDER BY converted_column DESC; ``` 这样不仅保持原始数据不变,还能够灵活运用变换后的数值参逻辑判断或其他复杂计算过程[^4]。 以上就是关于如何将在 MySQL 数据库存储为 varchars 的数据项转变成为 integers 的一些基本技巧。每种技术都有各自的特点和局限之处,在实际应用过程中应当依据具体情况选取最合适的手段加以实施。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值