MySQL数据类型 int(M) 表示什么意思?详解mysql int类型的长度值问题

时间:2021-11-07 18:12:49

MySQL 数据类型中的 integer types 有点奇怪。你可能会见到诸如:int(3)、int(4)、int(8) 之类的 int 数据类型。刚接触 MySQL 的时候,我还以为 int(3) 占用的存储空间比 int(4) 要小, int(4) 占用的存储空间比 int(8) 小。

后来,参看 MySQL 手册,发现自己理解错了。

int(M): M indicates the maximum display width for integer types.

在 integer 数据类型中,M 表示最大显示宽度。

原来,在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。 int(3)、int(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间。说白了,除了显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。

另外,int(M) 只有跟 zerofill 结合起来,才能使我们清楚的看到不同之处。

MySQL> drop table if exists t;
MySQL> create table t(id int zerofill);
MySQL> insert into t(id) values(10); MySQL> select * from t;
+------------+
| id |
+------------+
| 0000000010 |
+------------+ MySQL> alter table t change column id id int(3) zerofill; MySQL> select * from t;
+------+
| id |
+------+
| 010 |
+------+ MySQL>
MySQL> alter table t change column id id int(4) zerofill; MySQL> select * from t;
+------+
| id |
+------+
| 0010 |
+------+ MySQL>
MySQL> insert into t(id) values(1000000); MySQL> select * from t;
+---------+
| id |
+---------+
| 0010 |
| 1000000 |
+---------+

从上面的测试可以看出,“(M)”指定了 int 型数值显示的宽度,如果字段数据类型是 int(4),则:当显示数值 10 时,在左边要补上 “00”;当显示数值 100 是,在左边要补上“0”;当显示数值 1000000 时,已经超过了指定宽度“(4)”,因此按原样输出。

在使用 MySQL 数据类型中的整数类型(tinyint、smallint、 mediumint、 int/integer、bigint)时,非特殊需求下,在数据类型后加个“(M)”,我想不出有何意义。

另外,在 MySQL 数据类型中,integer 和 int 同义。到底使用哪个,自己看着办吧。


详解 MySQL int类型 的长度值问题

MySQL在建表的时候int类型后的长度代表什么?是该列允许存储值的最大宽度吗?为什么我设置成int(1),也一样能存10、100、1000呢。

当时我虽然知道int(1),这个长度1并不代表允许存储的宽度,但却没有一个合理的解释。或者说对这个长度也没有真正的研究过到底代表什么,平时都用int(11),也不知道为什么要11位。所以我在网上查阅了一些资料,也仔细的看了MySQL手册关于int data type的说法。

以下是每个整数类型的存储和范围(来自MySQL手册)

类型 字节 最小值(带符号的 / 无符号的) 最大值(带符号的 / 无符号的)
TINYINT 1 -128 / 0 127 / 255
SMALLINT 2 -32768 / 0 32767 / 65535
MEDIUMINT 3 -8388608 / 0 8388607 / 16777215
INT 4 -2147483648 / 0 2147483647 /4294967295
BIGINT 8 -9223372036854775808 / 0 9223372036854775807 /18446744073709551615

表格一共有四列分别表式:字段类型,占用字节数,允许存储的最小值,允许存储的最大值。

我们拿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组成)。

接下来我们再说说我们建表时的字段长度到底是怎么一回事。

CREATE TABLE `test` (
`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`number` INT(5) NOT NULL
) ENGINE = MYISAM;

以test表的number字段为例,大家看到我建的是int(5)

MySQL数据类型 int(M) 表示什么意思?详解mysql int类型的长度值问题

MySQL手册中这个长度/值用"M"来表示的。细心的朋友应该有注意到过MySQL手册上有这么一句话:

M指示最大显示宽度。最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关。

这句话看上去不太容易理解,因为这里有个关键词容易让我们混淆,“最大显示宽度”我们第一反应是该字段的值最大能允许存放的值的宽度。以为我们建了int(1),就不能存放数据10了,其实不是这个意思。这个M=5我们可以简单的理解成为,我们建立这个长度是为了告诉MySQL数据库我们这个字段的存储的数据的宽度为5位数,当然如果你不是5位数(只要在该类型的存储范围之内)MySQL也能正常存储,这也就能解释以上标红的话。我们把这个字段的“属性”修改为 UNSIGNED ZEROFILL 看一下效果:

MySQL数据类型 int(M) 表示什么意思?详解mysql int类型的长度值问题

我们看到现在我的number字段,长度(M)=5,属性=UNSIGNED ZEROFILL(无符号,用0来填充位数),设置这个属性后我往表时插入数据,系统会自动把number字段M不够5位的在左侧用0来填充。效果如下

MySQL数据类型 int(M) 表示什么意思?详解mysql int类型的长度值问题

手册上还有这么一句话“当 MySQL 为某些复杂的联结(join)生成临时表时,你可能会遇到问题,因为在这种情况下,MySQL 信任地认为所有的值均适合原始的列宽度"。这也让我不禁感叹这个宽度到底如何设置比较合适?

但有一点看完该文档你应该清楚的知道,长度M与你存放的数值型的数的大小无关。

MySQL数据类型 int(M) 表示什么意思?详解mysql int类型的长度值问题的更多相关文章

  1. Mysql高手系列 - 第8篇:详解排序和分页(order by & limit),及存在的坑

    这是Mysql系列第8篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符号分开的表示可选其一. 本章内容 详解排序查询 详解limit limit存在的坑 分 ...

  2. Mysql高手系列 - 第9篇:详解分组查询,mysql分组有大坑!

    这是Mysql系列第9篇. 环境:mysql5.7.25,cmd命令中进行演示. 本篇内容 分组查询语法 聚合函数 单字段分组 多字段分组 分组前筛选数据 分组后筛选数据 where和having的区 ...

  3. Mysql高手系列 - 第14篇:详解事务

    这是Mysql系列第14篇. 环境:mysql5.7.25,cmd命令中进行演示. 开发过程中,会经常用到数据库事务,所以本章非常重要. 本篇内容 什么是事务,它有什么用? 事务的几个特性 事务常见操 ...

  4. 【文章阅读】详解MySQL数据类型

    详解MySQL数据类型 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/8446246.html 注:对于MySQL的数据类型做了详细的讲解,这是我看过的最 ...

  5. MySQL存储过程详解 mysql 存储过程

    原文地址:MySQL存储过程详解  mysql 存储过程作者:王者佳暮 mysql存储过程详解 1.     存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储 ...

  6. mysqlint类型的长度值mysql在建表的时候int类型后的长度代表什么

    详解mysql int类型的长度值 mysql在建表的时候int类型后的长度代表什么 是该列允许存储值的最大宽度吗 为什么我设置成int(1), 也一样能存10,100,1000呢. 当时我虽然知道i ...

  7. [深入学习Web安全](5)详解MySQL注射

    [深入学习Web安全](5)详解MySQL注射 0x00 目录 0x00 目录 0x01 MySQL注射的简单介绍 0x02 对于information_schema库的研究 0x03 注射第一步—— ...

  8. MYSQL服务器my.cnf配置文档详解

    MYSQL服务器my.cnf配置文档详解 硬件:内存16G [client] port = 3306 socket = /data/3306/mysql.sock [mysql] no-auto-re ...

  9. mysql服务性能优化—my.cnf配置说明详解

    MYSQL服务器my.cnf配置文档详解硬件:内存16G [client]port = 3306socket = /data/3306/mysql.sock [mysql]no-auto-rehash ...

随机推荐

  1. PostgreSql+PostGIS和uDig的安装

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 总体来说,这两款开源软件均是很好安装的,一般按照提示一步一步 ...

  2. Java多线程编程核心技术---学习分享

    继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...

  3. 中兴手机关闭3G网络

    手机总是自动在2G和3G之间切换,关闭3G算了. 拨*983*683# 出来画面,然后选GSM Only即可 网上还有另一种方法: *#*#4636#*#* 在这个里,我没有找到GSM Only

  4. Android 设计模式 之 观察者模式

    /* * 观察者模式 *      定义对象间的一种一个(Subject)对多(Observer)的依赖关系,当一个对象的状态发送改变时,所以依赖于它的 * 对象都得到通知并被自动更新 * * 当然, ...

  5. CSS Layout

    fontline-heightcolormarginpaddingbordertext-alignbackground widthheightfloatcleardisplay 定位属性 属 性 描 ...

  6. Codeforces Round #353 (Div. 2) D. Tree Construction (二分,stl_set)

    题目链接:http://codeforces.com/problemset/problem/675/D 给你一个如题的二叉树,让你求出每个节点的父节点是多少. 用set来存储每个数,遍历到a[i]的时 ...

  7. 《virtualbox完全学习手册》

    <virtualbox完全学习手册>之VirtualBox开源版和闭源版的区别 <virtualbox完全学习手册>之 玩转virtualbox的虚拟BIOS <virt ...

  8. BeanUtils在web项目中的应用

    package cn.gdpe.jdbc; import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; im ...

  9. 第七讲:HTML5中的canvas两个小球全然弹性碰撞

    <html> <head> <title>小球之间的碰撞(全然弹性碰撞)</title> <script src="../js/jsce ...

  10. 【转】Java 多线程(四) 多线程访问成员变量与局部变量

    原文网址:http://www.cnblogs.com/mengdd/archive/2013/02/16/2913659.html 先看一个程序例子: public class HelloThrea ...