MySQL中int值范围的分析

这个代表显示宽度整数列的显示宽度与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,比如,不管设定了显示宽度是多少个字符,bigint都要占用8个字节。
       int是整型,(11)是指显示字符的长度,但要加参数的,最大为255,比如它是记录行数的id,插入10笔资料,它就显示00000000001 ~~~00000000010,当字符的位数超过11,它也只显示11位,如果你没有加那个让它未满11位就前面加0的参数,它不会在前面加0。
       声明整型数据列时,我们可以为它指定个显示宽度M(1~255),如INT(5),指定显示宽度为5个字符,如果没有给它指定显示宽度,MySQL会为它指定一个默认值。显示宽度只用于显示,并不能限制取值范围和占用空间,如:INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是999,而是INT整型所允许的最大值。
       MySQL有五种整型数据列类型,即TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。它们之间的区别是取值范围不同,存储空间也各不相同。在整型数据列后加上UNSIGNED属性可以禁止负数,取值从0开始。

int范围
Type Bytes Minimum Value Maximum Value 
    (Signed/Unsigned) (Signed/Unsigned) 
TINYINT 1 -128 127 
    0 255 
SMALLINT 2 -32768 32767 
    0 65535 
MEDIUMINT 3 -8388608 8388607 
    0 16777215 
INT 4 -2147483648 2147483647 
    0 4294967295 
BIGINT 8 -9223372036854775808 9223372036854775807 
    0 18446744073709551615


下面为官网的说明
 代码如下 复制代码 
Be careful when considering ENUM('T','F') as "true binary".
Example:
CREATE TABLE `bits` (
`val` ENUM('T','F') NOT NULL
);
mysql> INSERT INTO `bits` (`val`) VALUES ('W'), ('T'), ('F');
Query OK, 3 rows affected, 1 warning (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 1
mysql> SHOW WARNINGS;
 
+---------+------+------------------------------------------+| Level   | Code | Message                                  |+---------+------+------------------------------------------+| Warning | 1265 | Data truncated for column 'val' at row 1 |+---------+------+------------------------------------------+1 row in set (0.00 sec)
mysql> SELECT COUNT(DISTINCT val) FROM bits;
+---------------------+| COUNT(DISTINCT val) |+---------------------+|                   3 |+---------------------+1 row in set (0.00 sec)
Well, shouldn't a binary type have only two distinct values?
(Note that it isn't NULL.)
Explanation from manual (10.4.4. The ENUM Type):
-----
If you insert an invalid value into an ENUM (that is, a string not present in the list of permitted values), the empty string is inserted instead as a special error value. This string can be distinguished from a “normal” empty string by the fact that this string has the numeric value 0. More about this later


<think>嗯,用户问的是MySQLINT主键能用到多大。首先,我得确认INT类型在MySQL中的存储大小和范围INT是4字节,有符号的范围是-2147483648到2147483647,无符号的话是0到4294967295。所以主键如果用的是INT有符号的话,最大是2147483647,无符号的话是4294967295。 接下来要考虑用户的实际应用场景。用户可能想知道他们的数据量会不会超过这个限制。比如,如果主键是自增的,并且数据量增长很快,可能会达到上限。这时候可能需要用更大的类型,比如BIGINT,它是8字节,范围更大。 还要注意,主键一旦达到上限,继续插入会报错,特别是自增的情况下。所以如果预计数据量会超过INT范围,应该提前规划使用BIGINT。另外,可能用户没有意识到有符号和无符号的区别,需要解释清楚,避免他们误以为只能用正数范围。 还需要检查是否有其他因素影响,比如是否主键被设置成无符号的,或者是否有业务逻辑导致主键非连续增长,这些都会影响实际可用的大小。最后,要建议用户根据业务需求和数据增长预期来选择合适的数据类型,避免未来出现主键溢出的问题。</think>MySQL 中 `INT` 主键的取值范围取决于是否定义为无符号(UNSIGNED)。以下是逐步分析: ### 1. **`INT` 类型的基础范围** - **有符号(默认)**:取值范围为 $-2^{31}$ 到 $2^{31}-1$ $$ -2147483648 \leq \text{} \leq 2147483647 $$ - **无符号(UNSIGNED)**:取值范围为 $0$ 到 $2^{32}-1$ $$ 0 \leq \text{} \leq 4294967295 $$ ### 2. **主键的实际使用场景** - **自增主键**:若主键是自增的(`AUTO_INCREMENT`),通常建议使用 `UNSIGNED` 以充分利用范围。 - **业务主键**:若主键由业务逻辑生成(如订单号),需确保数不超过范围。 ### 3. **容量估算** - **有符号**:最多存储约 $21$ 亿条数据(2147483647)。 - **无符号**:最多存储约 $42$ 亿条数据(4294967295)。 ### 4. **超限风险** - 当自增主键达到最大时,继续插入会报错 `Duplicate entry`(主键冲突)。 - 需提前规划:若数据量可能超过 `INT`,建议使用 `BIGINT`(范围 $0$ 到 $18446744073709551615$)。 ### 5. **优化建议** ```sql -- 建表时显式声明为无符号 CREATE TABLE example ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, ... ); ``` ### 总结 - **普通 `INT`**:最大到 $2147483647$。 - **`INT UNSIGNED`**:最大到 $4294967295$。 - **高并发/大数据场景**:优先选择 `BIGINT` 避免主键溢出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值