首先:理清楚,字节、字、位、比特的概念和关系
1、位(bit)
来自英文bit,音译为“比特”,一般用“b”表示,表示二进制位。位是计算机内部数据储存的最小单位,11010100是一个8位二进制数。一个二进制位只可以表示0和1两种状态;两个二进制位可以表示00、01、10、11四种状态;三位二进制数可表示八种状态
2、字节(byte)
字节来自英文Byte,音译为“拜特”,习惯上用大写的“B”表示。
字节是计算机中数据处理的基本单位。计算机中以字节为单位存储和解释信息,规定一个字节由八个二进制位构成,即1个字节等于8个比特(1Byte=8bit)。八位二进制数最小为00000000,最大为11111111;通常1个字节可以存入一个ASCII码,2个字节可以存放一个汉字国标码。
3、字
计算机进行数据处理时,一次存取、加工和传送的数据长度称为字(word)。一个字通常由一个或多个(一般是字节的整数位)字节构成。例如286微机的字由2个字节组成,它的字长为16;486微机的字由4个字节组成,它的字长为32位机。
计算机的字长决定了其CPU一次操作处理实际位数的多少,由此可见计算机的字长越大,其性能越优越。
1位=1比特(这两个是一个东西)
1字节=8位
1字=2字节
1字=16位
然后,mysql的基本数据类型如下:
这些类型,是定长的,其容量是不会随着后面的数字而变化的,比如int(11)和int(8),都是一样的占4字节。tinyint(1)和tinyint(10)也都占用一个字节。
那么后面的11和8,有啥用呢。
http://zhidao.baidu.com/link?url=b0Z-WIhggaErl3uhMrAhoEXQG_3zotyd7r31O3RXSYiFJo1Cad-NeWN8cFXZFI50yVG_lpKooT7OjLhIa20ephKFJYD-fV9ZAv_o63AfyVq
mysql数据库中以 :数据类型(m) 来约束数据,其中 数字m在不同的数据类型中表示含义是不同的。 咱们这里只讲整数。
整型数系统已经限制了取值范围,tinyint占1个字节、int占4个字节。所以整型数后面的m不是表示的数据长度,而是表示数据在显示时显示的最小长度。
tinyint(1) 这里的1表示的是 最短显示一个字符。tinyint(2) 这里的2表示的是 最短显示两个字符。
当字符长度超过(m)时,相当于啥都没发生;
当字符长度小于(m)时,就需要指定拿某个字符来填充,比如zerofill(表示用0填充),
设置tinyint(2) zerofill 你插入1时他会显示01;设置tinyint(4) zerofill 你插入1时他会显示0001。
所以,没有zerofill(填充零),(m)就是无用的。
在mysql中我做过实验,对于一个tinyint类型的字段,不管它是tinyint(1)还是tinyint(2)还是tinyint(3),
当你插入大于127的数,都会报错:超出范围值
总结:int(11),tinyint(1),bigint(20),后面的数字,不代表占用空间容量。而代表最小显示位数。这个东西基本没有意义,除非你对字段指定zerofill。
所以我们在设计mysql数据库时,
建表时,mysql会自动分配长度:int(11)、tinyint(4)、smallint(6)、mediumint(9)、bigint(20)。
所以,就用这些默认的显示长度就可以了。不用再去自己填长度,比如搞个int(10)、tinyint(1)之类的,基本没用。而且导致表的字段类型多样化。
http://blog.csdn.net/longyulu/article/details/7326581
该文很好地总结了mysql所有的数据类型。
我在建一个float类型的字段时,故意建成float(2,3)型,是错误的。报错如下。
第一个数字M,代表总长度限制(总长度包括小数位和整数位),2代表总长度不能超过2个字符,比如2.34,就超过了2位总长度;
第二个数字D,代表小数位的长度限制。0.2表示占用了1个小数位。
这样看,当然M必需大于等于D。
比如设置为float(2,2),那么写入12.3这个数字时,会报错:超出范围值
比如设置为float(2,1),那么写入12.3这个数字时,会报错:超出范围值
比如设置为float(5,2)那么写入123.126这个数字时,实际插入的是123.13
(经过测试发现是 5舍6入)
比如设置为float(5,2)那么写入1233.12这个数字时,会报错:超出范围值
那么设置为float(0,0),则相当于不受限制,或者说受float本身的精度限制。
对于mysql的浮点型,看这篇:http://www.jb51.net/article/31723.htm