整型
INT 类型可分为 TINYINT,SMALLINIT, MEDIUMINT,INT,BIGINT。分别占用1,2,3,4,8字节存储空间。这些 INT 类型又分为有符号(signed)和无符号(unsigned),无符号的最大值基本上就是有符号最大值的2倍。
例如,对于 TINYINT:
- 有符号(signed) : [-128, 127]
- 无符号(unsigned) : [0, 255]
无符号比有符号的最大值并大不了多少,在数量级上没有什么不同, 推荐使用有符号 。
下面是无符号的弊端演示:
mysql> create table cyt(a int unsigned, b int unsigned);
mysql> insert into cyt values(1,2);
mysql> select b-a from cyt; <--- 返回 1
mysql> select a-b from cyt;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(`demodb`.`cyt`.`a` - `demodb`.`cyt`.`b`)'
处理办法:
mysql> set sql_mode = 'no_unsigned_subtraction'; <--- 启用后,两个 unsigned 相减返回 signed。
mysql> select a-b from cyt; <--- 返回 -1
INT 类型经常用于自增列,推荐使用 BIGINT,而不是 INT,每张表只能有一个自增列,且必须定义为索引的一部分。
drop table cyt;
create table cyt (id int auto_increment primary key);
insert 0 和 NULL 的效果是一样的,都是代表自增,insert 其它值就是插入指定的值,update 为 0 就是修改为 0。
如何插入 0:我也不知道,但是通常来说,插入 0 的意义也不是很大,另外可以通过 update 为 0来曲线救国。
关于 INT(n)
INT(n)只有当该列配置了 ZEROFILL 时才有意义,N 是显示宽度,跟数据存储没有关系。zerofill 表示当存储的数字长度 < N 时,用数字0填充左边,直至补满长度 N。当存储数字的长度超过N时,按照实际存储的数字显示。
create table cyt(id int(3) zerofill);
这样一来,插入 1 将显示 001,插入 12345 将显示 12345。
非整型
FLOAT: 单精度(4字字)
DOUBLE: 双精度(8字节)
DECIMAL: 高精度(财务系统)
DECIMAL(P,D) 相当于oracle的number类型,DECIMAL(P,D)表示列可以存储D位小数的P位数。十进制列的实际范围取决于精度和刻度。