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

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

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

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

手册上还有这么一句话“当 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. 详解MySQL索引

    原文链接详解MySQL索引 索引介绍 索引是帮助MySQL高效获取数据的数据结构.在数据之外,数据库系统还维护着一个用来查找数据的数据结构,这些数据结构指向着特定的数据,可以实现高级的查找算法. 本文 ...

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

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

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

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

随机推荐

  1. aa

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> us ...

  2. Vijos1006P1006晴天小猪历险记之Hill[最短路]

    P1006晴天小猪历险记之Hill Accepted 标签:晴天小猪历险记[显示标签]     背景 在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳.勇敢.善良.团结……不过有一 ...

  3. Vijos1450 包裹快递[二分答案]

    背景 小K成功地破解了密文.但是乘车到X国的时候,发现钱包被偷了,于是无奈之下只好作快递员来攒足路费去Orz教主…… 描述 一个快递公司要将n个包裹分别送到n个地方,并分配给邮递员小K一个事先设定好的 ...

  4. 解决www.github.com访问太慢的问题

    解决www.github.com访问太慢的问题 使用www.github.com的过程中,有时候打开会特别的慢,原因github.com的域名被一堵伟大的墙挡在了外面.但是我们可以通过修改本机的hos ...

  5. java数组初始化函数

    用法1:接受2个参数Arrays.fill( a1, value );注:a1是一个数组变量,value是一个a1中元素数据类型的值,作用:填充a1数组中的每个元素都是value例如:boolean[ ...

  6. flex引起height:100%失效

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  7. 链接rel属性external、nofollow、external nofollow三种写法的区别

    <script language="javascript" type="text/javascript" src="http://files.c ...

  8. 超棒的javascript移动触摸设备开发类库-QUOjs

    开发手机端网站.少不了手势事件? 手势事件怎么写? 手势事件怎么去判断? 对于新手来说.真的很Dan碎! 下面为大家推荐一款插件QUOjs 官方网站http://quojs.tapquo.com/ 这 ...

  9. Linux(CentOs6.4)安装Git

    安装之前我们先来了解下git,并且要反问下:我为什么要使用git?svn用的不是很好嘛,我干嘛要换?... 问1:为什么需要版本控制系统? 版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订 ...

  10. 51Nod-1091 线段的重叠

    51Nod 1091:  http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1091   1091 线段的重叠 基准时间限制: ...