整型

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位数。十进制列的实际范围取决于精度和刻度。

-- By 许望(RHCA、OCM、VCP)
最后修改:2019 年 10 月 21 日 03 : 30 PM
如果觉得我的文章对你有用,请随意赞赏